使用 new 运算符创建的字符串是否驻留在堆上以及字符串池上?
或者可能有人可以将我指向一些文档或链接来指导我的字符串池行为?
Java 代码中的字符串字面量驻留在字符串池中,但使用 new 创建的却没有。
字符串池是一种缓存,也存储在堆中。
情况1-
String s1="world";
String s2="india";
String s3="world";
这里将在 Pool 中创建两个对象。s1 和 s3 将指向同一个对象。字符串文字进入池内存。
案例2-
String s1=new String("world");
String s2=new String("india");
String s3=new String("world");
这里将在堆上创建三个对象。
新词使用堆内存来创建对象。
希望我能告诉。
有关更多详细信息,请参见链接 。
使用 new 运算符创建的字符串驻留在堆上,而不是在字符串池中(字符串池也存在于堆内存中)。但是您可以通过使用将该对象移动到池中String.intern()
。
调用String.intern()
字符串后,如果使用new
关键字创建的字符串已经存在于池中,则返回池对象的引用。所以现在它将指向池化对象而不是前一个。更多详情
实际上什么都没有承诺。
编译器/JVM 可能会决定在字符串池中创建它,但也可以在 neap 上创建它。今天它可能会在字符串字面量池中为您创建字符串,明天在 JVM 更新后它可能会在堆上为完全相同的代码创建它们。
关键是你的代码不应该依赖于你的字符串是在哪里创建的。
例如 - 避免使用 == 运算符比较字符串值。