Java的String类,清楚了吗?

下面的测试是在hotspot,jdk8环境下进行测试的
     
String s1 = "abc";
String s2 = "ab" + "c";
System.out.println(s1 == s2);//true。优化的结果


String str0 = new StringBuilder("计算机").toString();
System.out.println(str0.intern() == str0);//false.常量池里面有个"计算机"对象地址是A,堆里面"计算机"对象地址是B,str0.intern()方法,检查常量池里面是否有"计算机",发现有返回地址A,所以不相等

String str1 = new StringBuilder("计算机").append("新").toString();
System.out.println(str1.intern() == str1);//true.常量池里面有个"计算机"对象地址是A,堆里面"计算机新"对象地址是B,str0.intern()方法,检查常量池里面是否有"计算机新",发现没有则返回"计算机新"的引用地址,所以相等

String str2 = new String("计算机");
System.out.println(str2.intern() == str2);//false.常量池里面有个"计算机"对象地址是A,堆里面"计算机"对象地址是B,str0.intern()方法,检查常量池里面是否有"计算机",发现有返回地址A,所以不相等

String str3 = new StringBuilder("jav").append("a").toString();
System.out.println(str3.intern() == str3);//false.这是个坑,因为常量池里面默认就包含"java",所以str3.intern()返回的是默认"java"的地址,所以不相等



String str4 = new StringBuilder("计算机").append("11").toString();
System.out.println(str4.intern()==str4);//true.常量池里面有个"计算机"对象地址是A,内存里面"计算机新"对象地址是B,str0.intern()方法,检查常量池里面是否有"计算机11",发现没有则返回"计算机11"的引用地址,所以相等


String str5 = new StringBuilder("计算机").append("22").toString();
String str6 = new String("计算机22");
System.out.println(str5.intern()==str5);//false.str5.intern()检测常量池里面已经有"计算机22",也就是返回str6对象的地址,所以不相等

 






posted @ 2021-10-15 17:19  Lucy151213  阅读(20)  评论(0编辑  收藏  举报