1

我参考了以下链接

Java中的字符串池是什么?

垃圾收集和字符串

http://www.xyzws.com/Javafaq/what-is-string-literal-pool/3

关于Java的字符串池的问题

还是有些疑惑,请帮帮我

            `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);`

这给出了输出:

所以当两个字符串对象具有相同的字面量时执行字符串池???

如果那么两个字符串对象将在字符串池中创建?

为什么第二个输出是假的???

我读到 String 类是不可变的

abc并且abcd有不同的对象引用然后不可变意味着

“第一个字符串对象将由 JVM 创建,并提供两个对 abc 和 abcd 的引用 “我说得对吗?

非常感谢你........

4

4 回答 4

2

第二输出false既是字符串 abcabcd具有不同的内容(文本)

是的,正如您所说,String 类是不可变的,即它们的内容不会更改,如果您更改字符串文本,那么JVM将分配一个新空间而不是更改它。

现在,当您使用某些文本创建新String引用时,JVM将检查该文本是否已存在于池中,如果然后将您的字符串引用到该文本,否则将在池中 创建新文本

于 2012-08-01T09:29:06.247 回答
1

考虑第一个代码,

在执行语句String abc="hello"时,JVM 会做以下事情 1. 创建一个 String 类型的引用 abc。2. 检查字符串池中的文字“hello”是否可用,如果可用,它将其引用值分配给 abc,否则将创建字符串文字“hello”,将其引用分配给 abc 并将其添加到字符串池。

将重复相同的步骤String abcd="hello"。在这里,由于“hello”已经在字符串池中可用,abcd 也将引用它。

在第二个代码块中也将遵循这些相同的步骤,(实际上每次使用这样的语句创建字符串对象时)只是文字“hello world”和“hello”将被不同地创建并分配给它们各自的变量。

我想,现在你可以猜到上面两个代码示例输出背后的原因了。

字符串是不可变的,意味着你不能改变任何字符串对象。相反,JVM 将创建新的字符串对象(或从字符串池中获取一个)并将其分配给引用。例如

   String varA = "hello"; -> 1

   String varB = "hello"; -> 2

   varA="world" -> 3

   varB ="world" -> 4

在第 1 行,JVM 将在字符串池中创建字符串对象“hello”并将其引用分配给 varA。在第 2 行,JVM 会将字符串池中已经存在的“hello”对象的引用分配给 varB。在第 3 行,JVM 将创建一个新对象“world”并将其引用分配给 varA。现在字符串池将有两个对象,“hello”和“world”。在第 4 行,JVM 会将字符串池中已经存在的“world”对象的引用分配给 varB。字符串池仍然有两个对象,“hello”和“world”。

所以基本上,JVM 没有修改任何 String 对象,它只是修改了引用。

希望它可以帮助你。如果您有任何问题,请发表评论。

于 2012-08-01T09:42:05.307 回答
1

所以当两个字符串对象具有相同的字面量时执行字符串池???

--> 不完全是,字符串池是在定义文字字符串的时候进行的。如果您创建像String obj = "sometext"和创建第二个像这样的文字字符串对象String obj1 = "some Other Text",则 obj1 的内容将被 JVM 与“sometext”进行比较。String str1 = "hello"如果两个内容像and一样相等String str2 = "hello",则对象引用str1andstr2将指向同一个对象(“hello”)。

为什么第二个输出是假的???

--> 因为abcandabcd指向不同的字符串对象。

不可变意味着:一旦创建了对象,您就无法更改其内容。

于 2012-08-01T09:43:38.910 回答
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 == foo2internfoo1 == foo2.intern()equals

于 2012-08-01T09:43:55.190 回答