我已经推荐了以下链接
Garbage collection and Strings
http://www.xyzws.com/Javafaq/what-is-string-literal-pool/3
Questions about Java's String pool
还有一些疑问请帮帮我
`public class StrPool
{
public static void main(String[] args)
{
String abc="hello";
String abcd="hello";
System.out.println(abc==abcd);
}
}
`
在上面的例子中OP: true
因此我们可以确认这两个对象都来自同一个String对象。很清楚。
`String abc="hello World";
String abcd="hello";
System.out.println(abc==abcd);`
这会输出: false
因此当两个String对象具有相同的文字???
时执行字符串池如果那么String的两个对象将在String pool中创建??
为什么第二个输出是假的???
我读了String类是不可变的
abc
和abcd
具有不同的对象引用,然后是不可变的意味着
“First String对象将由JVM创建并给出两个对abc和abcd的引用”我是对的???
非常感谢........
答案 0 :(得分:2)
第二次输出为false
,因为字符串 abc
和abcd
具有不同的内容(文字)
是的,正如你所说字符串类是不可变的,即如果你改变字符串文本,那么它们的内容不会更改 < em> JVM 将分配新空间而不是更改它。
现在当您使用某些文本创建新的String
引用时, JVM 将检查池中的文本是否已存在 然后将您的字符串引用到该文本,或其他将在池中创建新文字
答案 1 :(得分:1)
考虑第一个代码,
执行语句String abc="hello"
时,JVM将执行以下操作
1.创建String类型的引用abc。
2.检查字符串池中是否有文字“hello”
如果可用,它会将其参考值分配给abc,
否则它将创建字符串文字“hello”,将其引用分配给abc并将其添加到String池。
String abcd="hello"
将重复相同的步骤。这里,由于字符串池中已经可以使用“hello”,因此abcd将引用它。
在第二个代码块中也会遵循这些相同的步骤,(实际上每次使用这样的语句创建字符串对象时)只是文本“hello world”和“hello”将以不同的方式创建并分配给它们各自的变量
我想,现在你可以猜出上面两个代码示例的输出背后的原因。
String是不可变的,意味着您无法更改任何字符串对象。相反,JVM将创建新的字符串对象(或从字符串池中获取一个)并将其分配给引用。 例如
String varA = "hello"; -> 1
String varB = "hello"; -> 2
varA="world" -> 3
varB ="world" -> 4
在第1行,JVM将在字符串池中创建String对象“hello”并将其引用分配给varA。 在第2行,JVM将已经存在于String池中的“hello”对象的引用分配给varB。 在第3行,JVM将创建一个新对象“world”并将其引用分配给varA。现在String pool将有两个对象,“hello”和“world”。 在第4行,JVM将已经存在于String池中的“world”对象的引用分配给varB。字符串池仍然有两个对象,“hello”和“world”。
基本上,JVM没有修改任何String对象,它刚刚修改了引用。
希望它对你有所帮助。如果您有任何问题,请发表评论。
答案 2 :(得分:1)
因此当两个String对象具有相同的文字???
时执行字符串池
- &GT;不完全是,在定义文字字符串时执行字符串池。如果您创建文字字符串对象,如String obj = "sometext"
,并在创建第二个文字像String obj1 = "some Other Text"
时,obj1内容将被JVM与“sometext”进行比较。如果两个内容都相同,如String str1 = "hello"
和String str2 = "hello"
,则对象引用str1
和str2
将指向同一个对象(“hello”)。
为什么第二个输出是假的???
- &GT;因为abc
和abcd
指向不同的字符串对象。
不可变意味着:创建对象后,您无法更改其内容。
答案 3 :(得分:1)
Java会自动将String.intern应用于双引号文字。因此可以保证
String foo1 = "foo";
String foo2 = "foo";
assert foo1 == foo2;
但是,对于构造而不是作为文字的字符串,这是不可保证的,即给定
String foo1 = "foo";
// contrived example, but imagine foo2 came from reading a file or similar
String foo2 = new String(new char[] { 'f', 'o', 'o' });
保证foo1.equals(foo2)
但不一定是foo1 == foo2
。您可以明确地调用intern
- 保证foo1 == foo2.intern()
- 但是当您关心值相等时使用equals
通常更清楚,而当您真正需要引用相等时,只使用==。 / p>