
-
new String的方式创建,或者使用
+拼接变量时,JVM都会重新创建一个新对象。String s1 = "1"; String s2 = s1 + "2";因为
s1是引用变量,JVM在编译期不能确定s1的值,所以会在堆中新创建一个对象指向s2。如果s1加个final限制,让s1就能在编译阶段确定下来,它就是常量,因此在编译时,s1 + "2"就会被优化成12。
intern方法也是类似处理。
String为什么不可变
不能被继承;未提供能改变它状态的公共方法;它的工具方法都是返回一个新的字符串。
String不可变有什么好处
-
因为不可变,所以是线程安全的。
-
HashMap的Key。String的
hashCode方法在第一次调用的时候会缓存它的hash值,再次调用的时候无需再次计算了。关于这一点,我们去看它的源码就会一目了然:将hash函数的计算结果赋值给String的成员变变量hash,第二次计算就能直接返回。从这里可以看出,从HashMap、HashSet等使用hash函数计算元素位置的集合中查找一个元素是非常快的。