我有这样的场景 -
String s = "abc", t="abc"; //LINE 1
System.out.println(s==t); // definitely it would return true; //LINE 2
s=s+"d"; t=t+"d"; //LINE 3
System.out.println(s==t); // output would be false; but why??
s=s.intern(); t=t.intern();
System.out.println(s==t); // it would return true;
Run Code Online (Sandbox Code Playgroud)
我想知道为什么第二个print语句返回false.请提供任何解释相同的参考链接.
在第1行创建t; 实习生被召唤,并指出"abc"为什么不在第3行调用实习生?
java字符串是不可变的.
这意味着当你做一些像s=s+"d"你实际创建一个全新的字符串,并将其分配给s.
最重要的是,编译器会进行常量检测和分配,因此在编写s="abc", t="abc"编译器时重新使用相同的引用并且您的代码是有效的s=t="abc"
所以你从完全相同的字符串实例开始(由于编译器优化)并将其转换为2个完全相同但又不同的字符串,此时s==t为false(s.equals(t)本来是真的,因为它比较内容而不是内存中的地址).
接下来是实习生().intern()的作用是在字符串缓存中查找相同的字符串并返回它.如果它没有找到相同的条目,则将提供的参数放入缓存并返回参数.所以s=s.intern()将s放入字符串缓存并返回它(所以s没有改变),但后面的调用t=t.intern()实际上返回s,所以s==t再次.
| 归档时间: |
|
| 查看次数: |
142 次 |
| 最近记录: |