首页 新闻 会员 周边

String和StringBuilder的一些问题

0
悬赏园豆:5 [待解决问题]

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

请问是为什么???

学计算机的人绝不认输的主页 学计算机的人绝不认输 | 初学一级 | 园豆:191
提问于:2017-08-03 09:12
< >
分享
所有回答(7)
0

理解String的intern方法:它遵循对于任何两个字符串 s 和 t,当且当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。

理解String与StringBuilder的区别,还有toString的用法,

长跑 | 园豆:11 (初学一级) | 2017-08-03 09:30

感谢您的回答,您能详细的解释一下上面的代码吗?谢谢! 

0

参考:http://www.cnblogs.com/xiaolifeidao/p/3818781.html

http://www.cnblogs.com/A_ming/archive/2010/04/13/1711395.html

ycyzharry | 园豆:25651 (高人七级) | 2017-08-03 09:59

谢谢您的回答,我看看这两篇博客 

0

一直看不懂的是第二个输出,现在知道了,哈哈……

http://blog.csdn.net/chaofanwei/article/details/19486919

让我发会呆 | 园豆:2929 (老鸟四级) | 2017-08-03 10:01

系统版本的问题吗?

支持(0) 反对(0) 金琥 | 园豆:2605 (老鸟四级) | 2017-08-03 10:12

@金琥: 我猜你用的应该也是1.7,至于第二个为什么是false,因为"java"这个字符可能已经存在,并不是你自定义的,不信你把java改成jaaa试试,应该就是true了。

支持(0) 反对(0) 让我发会呆 | 园豆:2929 (老鸟四级) | 2017-08-03 10:21

@让我发会呆: 谢谢您的答复

0

你想要的详细解释是什么意思?每句代码的说明吗?

金琥 | 园豆:2605 (老鸟四级) | 2017-08-03 10:24

是的,其实我就是不明白jdk1.7及其以上版本intern方法的工作原理。我明白jdk1.6及其以下的。 

@宏客王子: https://tech.meituan.com/in_depth_understanding_string_intern.html

这个你看看吧,我只是大致扫了一眼,哎,要学的还很多!

支持(0) 反对(0) 让我发会呆 | 园豆:2929 (老鸟四级) | 2017-08-03 10:39

@让我发会呆: 好的,谢谢!

@宏客王子: 在jdk1.7中,intern()方法不再复制实例,只是在常量池中记录首次出现的实例的引用,因此如果该字符串是首次出现的,那么intern()返回的结果和StringBuilder创建的是同一实例。所以第一个输出的结果为true。但是因为“Java”这个字符串在执行StringBuilder.toString()以前已经出现过了,常量池中存的不是str2实例的引用,不符合“首次出现”原则,因此返回的结果不是指向同一个实例,即输出为false。

转自:http://blog.csdn.net/jsy625/article/details/44683677

支持(0) 反对(0) 金琥 | 园豆:2605 (老鸟四级) | 2017-08-03 10:44
0

用”String”.intern()方法的时候会返回”String”,但是这个方法会首先检查字符串池中是否有”String”这个字符串,如果存在则返回这个字符串的引用,否则就将这个字符串添加到字符串池中,然会返回这个字符串的引用。

番茄先生 | 园豆:911 (小虾三级) | 2017-08-03 17:11
0

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。

加加酱油 | 园豆:202 (菜鸟二级) | 2017-08-13 19:21
0

拼接后的字符串和初始化的字符串虽然看起来一样,实际是不一样的,你可以百度下string这个特殊的类型

jqw2009 | 园豆:2439 (老鸟四级) | 2017-08-14 15:09
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册