一:下面代码的输入结果是什么?

    1. String s1="abc";
    2. String s2=new String("abc);
    3. s2.intern();
    4. System.out.println(s1==s2);

    Sring s1=”abc” 创建一个对象”abc” 放在常量池当中
    当执行String s2=new String(“abc”) 不用在创建”abc”对象直接从常量池中拿,直接创建new String对象,放在堆区
    s2.intern()表示返回常量池中与s2所指向的这个字符串完全相同的字符串
    但是 s2.intern()没有将结果再一次赋值给s2,所以s2还是只想堆区空间
    所以,结果是 false
    二:请问String是线程安全的吗?
    答:安全的
    看线程安全不安全,就看同时访问有没有问题,会不会造成数据的覆盖不一致等问题
    String类是一个不可变类
    一旦创建String类对象没办法改变其中的内容,所以String是线程安全的
    三:为什么在使用HashMap的时候总是使用String类作为key的类型?
    答:
    (往String类的概念和key的要求方向去思考)
    HashMap集合中通过key的哈希码值来得到value的存储位置,String类作为key相当于利用String类的哈希码值来确定value的存储位置,优势在于String类为不可变类,内容不可改变,所以创建String类对象后可以直接计算哈希码值,然后进行单独保存起来,下次往hashMap存储可以直接取,不用再重新计算,效率会高
    四:Collection和Collections有什么区别?
    答:
    Collection是集合接口,顶层接口,主要提供针对于所有集合的一些基本通用方法,底层有子接口和实现类
    Collections是集合的工具类,仅仅是辅助,提供大量的静态方法比如排序等等
    五:HashMap在Java7和Java8中有哪些主要的不同之处?
    答:
    主要关注两点:
    Java7中采用的是链表数组,特点后续增加的元素会增加到链表的前面
    Java8中也采用的是链表数组,链表长度大于一个默认值,而且数组大于默认长度,他会把链表转成为红黑树,转为红黑树的优势是搜索速度快,java8我们插入元素的时候,跟java7不同在于,新元素是插入到链表的尾部(尾插法)
    扩容之后,存储的计算方法不同