模块三内容总结
笔试题一
下面代码的输出结果是什么?
String s1 = "abc";
String s2 = new String("abc");
s2.intern();
System.out.println(s1 == s2);
结果:
false
注:intern()-表示返回常量池中与当前这个字符串引用所描的字符串内容相同的对象的引用。(从常量池中找与s2所指向的字符串对象的内容相同的对象的引用)
s1在栈区申请一块内存,abc放入常量池
s2在栈区申请一块内存,在堆区new一个新对象。
如果没有第一行代码,执行第二行代码时会创建两个对象,但是因为有了第一行代码,在常量池中已经有了"abc",所以第二行只需要创建一个堆区对象
本题中s2调用intern方法后并没有再赋值给s2
笔试题二
- String是线程安全的吗?
安全,String是个不可变类,描述的是个常量,内容不可改变。
笔试题三
为什么在使用HashMap的时候总是使用String类作为key的类型?
String不可变类,意味着创建完对象后不可改变,也就是对象哈希码值不变,在创建完对象后就可以吧哈希码值算出来,把哈希码值单独缓存到一个地方,hashMap的底层是通过key的哈希码值来确定value的存储位置,而String类早早准备好的哈希码值就能很快调用,因而效率更高。