字符串池是在两个具有相同文字的字符串(java)时执行的

时间:2012-08-01 09:27:37

标签: java string oop pool

我已经推荐了以下链接

What is String pool in Java?

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类是不可变的

abcabcd具有不同的对象引用,然后是不可变的意味着

“First String对象将由JVM创建并给出两个对abc和abcd的引用”我是对的???

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

4 个答案:

答案 0 :(得分:2)

第二次输出为false,因为字符串 abcabcd具有不同的内容(文字)

是的,正如你所说字符串类是不可变的,即如果你改变字符串文本,那么它们的内容不会更改 < 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",则对象引用str1str2将指向同一个对象(“hello”)。

  

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

- &GT;因为abcabcd指向不同的字符串对象。

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

答案 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>