本文通过代码,展示了String对象易弄错的对象相等性判断。由于String对象用到的频率非常多,所以在我们给String对象赋字符串字面量时,会优先重字符串常量池中查找,找到了则返回,找不到则重新创建一个,并将该对象放到常量池中!
但是如果我们使用的是new关键字来创建String对象则与String常量池没有任何关系,都会重新创建一个!
另外通过subString方法截取的字符串也是重新创建的对象。
但是String对象有一个方法intern()会将自身的字符串值去String常量池中用equals方法去找,找到了则返回池中的对象,否则就在池中创建一个 新的对象
public class StringTest {
public static void main(String[] args){
String str1="a";//首先会先去String常量池里面去找,找到了就使用常量池里面的对象,否则就新建一个
String str2="a";//常量池中有了字符串“a”则返回该对象,不需要重新创建
String str6=new String("a");//不管常量池中是否有该对象,都会重新创建
String str3=str1+str2;//做字符串拼接时会创建新的对象
String str7=str1+"";//哪怕equals相等,但是也重新创建了对象
String str4=str3.substring(0,1);//字符串截取也是返回新的对象,并不是按equals到常量池中去找对象
String str5=new String("a").intern();//创建新对象时首先会先去String常量池里面去找,找到了就使用常量池里面的对象,否则就新建一个放入池中
System.out.println("str1==str2:"+(str1==str2));
System.out.println("str1==str6:"+(str1==str6));
System.out.println("str1:"+str1+ " str4:"+str4+" str1==str4:"+(str1==str4));
System.out.println("str1==str5:"+(str1==str5));
System.out.println("str1==str7:"+(str1==str7));
String str8=new String("b").intern();//演示在常量池中找不到对象,则新建一个放入池中
String str9="b";//常量池中已经有“b”字符串这个对象了,则直接使用池中这个对象
System.out.println("str8==str9:"+(str8==str9));
/*
* 结果如下
* str1==str2:true
str1==str6:false
str1:a str4:a str1==str4:false
str1==str5:false
str1==str7:false
str8==str9:true
*/
}
}