String字符串
-
String是不变对象,即:内容一旦创建值不可改变,若改变字符串内容必定要创建新的对象
-
JVM对字符串的一个优化为常量池,会缓存所有用字面量形式创建的字符串对象并进行重用
-
不是字面量形式直接创建的是不会重用对象的
-
编译器有一个特性,凡是在编译期间就能确定一个计算表达式的结果时,编译器会直接计算并将结果编译到class字节码文件中
-
比较字符串内容(仅仅比较值相等)要用equals方法,而不要直接使用“==”(值相等,所存的地址也要相等)比较
示例:
String s1 = "123abc"; //字面量形式(引用类型都要New,字符串除外)
String s2 = "123abc"; //重用s1对象
//s1与s2保存的地址相同,指向同一个字符串
System.out.println(s1 == s2); //true
String s4 = new String("123abc"); //不是字面量形式,一旦用new,会创建新的对象,但此时就不等于(所存的地址不一样)
System.out.println(s2==s4); //false
String s5 = "123" + "abc"; //此处根据第4点,String s5 = "123abc";因此s5会重用此前s2创建的对象
System.out.println(s2==s5); //true
String s = "123";
String s6 = s + "abc"; //此处由于s是变量,编译器是算不出来的,