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

net*_*ser 0 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;
Run Code Online (Sandbox Code Playgroud)

我想知道为什么第二个print语句返回false.请提供任何解释相同的参考链接.

在第1行创建t; 实习生被召唤,并指出"abc"为什么不在第3行调用实习生?

rad*_*dai 6

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再次.