作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个这样的场景 -
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;
我想知道为什么第二个 print 语句返回 false。请向我提供任何解释相同内容的引用链接。
在第 1 行创建 t 时;调用了 intern 并且它指向“abc”,为什么不在第 3 行调用 intern?
最佳答案
java 字符串是 immutable .
这意味着当您执行诸如 s=s+"d"
之类的操作时,您实际上是在创建一个全新的字符串,并将其分配给 s。
最重要的是,编译器会进行不断的检测和分配,因此当您编写 s="abc", t="abc"
时,编译器会重新使用相同的引用和您的代码实际上是 s=t="abc"
因此,您从完全相同的字符串实例开始(感谢编译器优化),并将其转换为 2 个相同但不同的字符串,此时 s==t
为 false (s. equals(t)
应该是 true,因为它比较内容而不是内存中的地址)。
下一个是 intern() 。 intern() 的作用是在字符串缓存中查找相同的字符串并返回它。如果没有找到相同的条目,则会将提供的参数放入缓存中并返回该参数。因此 s=s.intern()
将 s 放入字符串缓存中并返回它(因此 s
不变),但以下调用 t=t.intern( )
实际上返回 s
,因此再次 s==t
。
关于java - JVM如何为java中的String分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25143195/
我是一名优秀的程序员,十分优秀!