gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 06:29:30 25 4
gpt4 key购买 nike

我有一个这样的场景 -

 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com