Java-不可变字符串
一个字符串对象一旦产生,它的内容就是固定不变的。
String str1 = "Hello";
str1 = "Hi";
请问改变了字符对象没有?
当然没有,只不过是将 str1 这个引用指向了另一个字符串对象。
String str2 = "staph";
String str3 = "staph";
System.out.print(str2 == str3);
结果为:true
java运行时会维护一个String池,对于一些可以共享的字符串对象,会先在String池中查找看是否存在相同的字符串,如果有就直接返回该字符串对象,反之,在String池中创建该字符串对象。以减少内存的耗用
String str4 = new String("goodboy");
String str5 = new String("goodboy");
System.out.print(str4 == str5);
结果为:false
①String str4 = "goodboy"; 和 ②String str4 = new String("goodboy"); 字符串内容相同,但是却天差地别。①会现在String池中查找看是否有与之内容相同的字符串,②直接在堆上创建存储空间,存放字符串内容。
所以上列程序,相当于是创建了两个字符串对象。所以结果为:false
API 中 String 的 intern()方法
在intern() 方法被调用的时候,如果String池中已经包含了相同内容的字符串对象(相同与否由equals()决定),那么会从String池中返回给字符串对象,否则原字符串对象会被加到String池中,并返回这个字符串对象。
String str1 = "fly";
String str2 = "weight";
String str3 = "flyweight"
String str4 = str1 + str2;
System.out.print(str4 == str3);
结果:false
str4 = (str1 + str2).intern();
System.out.print(str4 == str3);
结果:true
在java中,使用+串联字符串会产生一个新的字符串对象。