String str1 = new StringBuilder("计算机").append("软件").toString();
System.out.println(str1.intern() == str1);
String str2 = new StringBuilder("ja").append("va").toString();
System.out.println(str2.intern() == str2);
String str3 = new StringBuilder("计算机软件").toString();
System.out.println(str3.intern() == str3);
System.out.println(str3.intern() == str1);
String str4 = new StringBuilder("java").toString();
System.out.println(str4.intern() == str4);
System.out.println(str4.intern() == str2);
代码的运行结果是
true
false
false
true
false
false
请问是为什么???
理解String的intern方法:它遵循对于任何两个字符串 s 和 t,当且当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。
理解String与StringBuilder的区别,还有toString的用法,
感谢您的回答,您能详细的解释一下上面的代码吗?谢谢!
参考:http://www.cnblogs.com/xiaolifeidao/p/3818781.html
http://www.cnblogs.com/A_ming/archive/2010/04/13/1711395.html
谢谢您的回答,我看看这两篇博客
一直看不懂的是第二个输出,现在知道了,哈哈……
http://blog.csdn.net/chaofanwei/article/details/19486919
系统版本的问题吗?
@金琥: 我猜你用的应该也是1.7,至于第二个为什么是false,因为"java"这个字符可能已经存在,并不是你自定义的,不信你把java改成jaaa试试,应该就是true了。
@让我发会呆: 谢谢您的答复
你想要的详细解释是什么意思?每句代码的说明吗?
是的,其实我就是不明白jdk1.7及其以上版本intern方法的工作原理。我明白jdk1.6及其以下的。
@宏客王子: https://tech.meituan.com/in_depth_understanding_string_intern.html
这个你看看吧,我只是大致扫了一眼,哎,要学的还很多!
@让我发会呆: 好的,谢谢!
@宏客王子: 在jdk1.7中,intern()方法不再复制实例,只是在常量池中记录首次出现的实例的引用,因此如果该字符串是首次出现的,那么intern()返回的结果和StringBuilder创建的是同一实例。所以第一个输出的结果为true。但是因为“Java”这个字符串在执行StringBuilder.toString()以前已经出现过了,常量池中存的不是str2实例的引用,不符合“首次出现”原则,因此返回的结果不是指向同一个实例,即输出为false。
转自:http://blog.csdn.net/jsy625/article/details/44683677
用”String”.intern()方法的时候会返回”String”,但是这个方法会首先检查字符串池中是否有”String”这个字符串,如果存在则返回这个字符串的引用,否则就将这个字符串添加到字符串池中,然会返回这个字符串的引用。
1.应该用的是jdk1.7,那么字符串常量池(简称SP)是在Heap中。
2.分析:
a. String str1 = new StringBuilder("计算机").append("软件").toString();
SP没有"计算机",添加到SP中;SP中没有"软件",添加到SP中;在Heap堆中创建了一个String对象,内容为"计算机软件",栈中的str1指向该创建对象。
b.System.out.println(str1.intern() == str1);
str1.intern():查看SP是否有"计算机软件"字符串,发现没有,则添加"计算机软件"字符串到SP中。由于jdk1.7把SP移到Heap中。故添加过程中不需要复制一份"计算机软件"字符串到SP中,而是使用一个指针指向str1所指向创建的String对象。这就省了存储"计算机软件"这部分内存。str1.intern()和str1所指向同一对象,为true。
c.String str2 = new StringBuilder("ja").append("va").toString();
"java"字符串已经存在于SP中,但是指针并没有指向你创建的str2所指的对象。str2.intern()指向SP中的"java"字符串,str2指向heap中新创建的对象,内容为"java",故为false。
拼接后的字符串和初始化的字符串虽然看起来一样,实际是不一样的,你可以百度下string这个特殊的类型