java - JVM如何为java中的String分配内存?

标签 java string jvm

我有一个这样的场景 -

 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/

相关文章:

java - Tomcat & Spring Web - 找不到类异常 org.springframework.web.context.ContextLoaderListener

c++ - 这五种不同的 cString 声明方式是怎么回事?

python - 在 python 中使用 str.format 时的引号

java - 如何重现 ClassCircularityError

java - 以正确的方式将经度和纬度坐标转换为 map 像素(X 和 Y)

java - 比较 JSTL 标签中的两个列表值

java - 请问,如何让代码在两台计算机或用户获胜后终止

python - 如何在 Python3 中解压单个变量元组?

java - 编写单元测试(java)的最佳位置?

java - 解释可能的堆外泄漏的 jemaloc 数据