日期:2014-05-20  浏览次数:20687 次

谁可以解释一下这段代码,谢谢!
String   str1   =   "a ";
String   str2   =   "bc ";
String   str3   =   "a "+ "bc ";
String   str4   =   str1+str2;

System.out.println(str3==str4);

str4   =   (str1+str2).intern();

System.out.println(str3==str4);

输出的结果将会是:
false
true

intern()方法的作用是检查字符串池里是否存在 "abc "这么一个字符串,如果存在,就返回池里的字符串;如果不存在,该方法会把 "abc "添加到字符串池中,然后再返回它的引用。

而我不明白的是:为什么str3与str4引用的不是同一个对象?

------解决方案--------------------
String是不变,对它的任何处理都会返回新的String实例。

String str3 = "a "+ "bc ";在编译后就完全等于 String str3 = "abc ";运行这段代码后,符串池里就存在 "abc "
String str4 = str1+str2;执行之后,会创建一个新的String变量(堆里的一个内存块),然后让str4指向这个新的变量。

所以,一开始的str4和str3引用的不是同一个对象
------解决方案--------------------
String str1 = "a ";
String str2 = "bc ";
String str3 = "a "+ "bc ";
String str4 = str1+str2;

System.out.println(str3==str4);

str4 = (str1+str2).intern();

System.out.println(str3==str4);
str3指向常量池中的abc。str1+str2指向堆中的abc ,intern()后返回常量池中的abc的引用,也就是str3,str4都指向常量池中的abc,所以指向的是同一个对象
------解决方案--------------------
str1和str2都是变量,str4在编译期不能决定值,所以不会使用常量池中的字串。
------解决方案--------------------
当CLASS文件初次被加载的时候,先在堆中分配空间,然后初始化;
String str1 = "a ";
String str2 = "bc ";
就是在这个时候进行的初始化(当然之前还有一些其它的,比如STATIC)

str3指向一个字符串池ABC,而str4仍然指向堆中;

但是在进行(str1+str2).intern();操作后,也是指向池中的ABC

intern()可以查询文档