new String()是否更新Java中的字符串池?[duplicate]

0kjbasz6  于 2023-01-11  发布在  Java
关注(0)|答案(4)|浏览(124)
    • 此问题在此处已有答案**:

Questions about Java's String pool [duplicate](7个答案)
3天前关闭。
如果我这样写:

String s1 = new String("ABC");
String s2 = "ABC";

字符串池在什么情况下更新?第一种,第二种还是两者都更新?

e0bqpujr

e0bqpujr1#

在上面的程序代码中,字符串池什么时候更新?
第一条语句将使用"ABC" String文字更新/添加到String池,但在堆中创建另一个对象,变量s1将引用堆对象。
第二条语句将引用已经创建的Pool String对象。

pod7payv

pod7payv2#

String s = new String("ABC");

这总是在堆上创建一个新的String对象,并将“ABC”添加到池中(如果不存在)。

String s= "ABC";

而这一行叫做字符串字面量。它检查字符串池是否已经有相同的字符串“ABC”。如果存在,则s将引用该对象,否则将创建一个新对象。
结论:new String()将始终创建一个新对象,并且string literal在创建对象之前会检查字符串池。

vof42yt1

vof42yt13#

String s1=new String("ABC");//creates two objects and one reference variable

在您的例子中,JVM将在普通(非池)堆内存中创建一个新的String对象,并将文字“ABC”放入字符串常量池中,变量s1将引用堆(非池)中的对象。
String Constant Pool
使用new操作符创建的String对象不引用字符串池中的对象,但可以使用String的intern()方法使其引用。java.lang.String.intern()返回一个interned String,即在全局String文本池中具有条目的String。如果String尚未在全局String文本池中,则将添加它。

每当你使用new关键字来创建字符串对象时,它会在堆中创建,然后检查字符串常量池中是否有相同的字符串常量。如果SCP不包含该字符串常量,则只在SCP中创建字符串常量。

1tuwyuhd

1tuwyuhd4#

没有。用构造函数创建的字符串永远不会进入字符串池。在这个例子中,创建了两个独立的对象。因此:
s1!= s2

相关问题