- String是不可变类;
- StringBuffer是线程安全的;
- StringBuilder是线程不安全的,java 5引入的;
public static void main(String[] args) {
String s1 = "Programming";
String s2 = new String("Programming");
String s3 = "Program";
String s4 = "ming";
String s5 = "Program" + "ming";
String s6 = s3 + s4;
System.out.println(s1 == s2);//false
System.out.println(s1 == s5);//true
System.out.println(s1 == s6);//false
System.out.println(s1 == s6.intern());//true
System.out.println(s2 == s2.intern());//false
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
System.out.println(s3.hashCode());
System.out.println(s4.hashCode());
System.out.println(s5.hashCode());
System.out.println(s6.hashCode());
}
为什么s1==s6是false呢?
- 字符串常量相加,jvm 会进行优化,不会创建 StringBuilder 对象
- 字符串变量加上常量,会创建 StringBuilder 对象,然后调用 append 方法
- for 循环中的字符串变量加上常量,会被优化成 StringBuilder.append(),多次相加只会创建一个 StringBuilder 对象