关于java字符串文字的冲突陈述

时间:2015-06-16 10:38:59

标签: java string

执行以下语句时会创建多少个对象?

 String s1 = "abc";
 String s2 = "abc";
 String s3 = new String("abc");
 String s4 = new String("abc");

鉴于以上java问题 - 我认为答案应该是3。 为第1行创建第一个对象,假设之前不存在字符串“abc”。 对于第二行,由于字符串文字被实习,因此不会创建额外的对象。对于第3和第4个语句,创建了更多对象。因此总共创建了3个对象。这个逻辑是内联的 java specs String literal

  

字符串文字是对String类实例的引用   (§4.3.1,§4.3.3)。 此外,字符串文字总是指相同的   类String的实例。这是因为字符串文字 - 或者更多   通常,字符串是常量表达式的值   (§15.28) - 被“实习”以便使用。来共享唯一的实例   方法String.intern。

令人困惑的是关于String

中的字符串的java教程
  

每当在代码中遇到字符串文字时,编译器   创建一个String对象及其值 - 在本例中为Hello world!。

使用“随时”在这里令人困惑。所以真正的问题是我们可以做些什么来让人们编辑教程来纠正它。否则它会让很多人感到困惑,毕竟这个网站甚至被有经验的专业人士引用。

5 个答案:

答案 0 :(得分:3)

你提到的Java教程是错误的,因为它没有考虑String interning。

您确认它将是三个对象

答案 1 :(得分:0)

你对对象的创建是正确的,它会创建三个对象!!!

答案 2 :(得分:0)

它会创建3个对象

  1. 对象#1:

    String s1 = "abc";
    
    String s2 = "abc";
    
  2. 对象#2:

    String s3 = new String("abc");
    
  3. 对象#3

    String s4 = new String("abc");
    

答案 3 :(得分:0)

感谢大家的回答。我刚刚向javasedocs_us@oracle.com报告了文件中的不一致(以及可能的错误)

希望他们能够做出回应并进行整改。

答案 4 :(得分:0)

阅读roger_that在这篇文章中的第二个答案。它会清除一切。

String is immutable. What exactly is the meaning?

顺便说一句,它将为字符串值创建3个对象。一个" abc"在常量字符串池中,s1和s2都将引用相同的值。两个不同的" abc"字符串池外的值,s3和s4将分别引用它们。

 String s1 = "abc";
 String s2 = "abc";
 String s3 = new String("abc");
 String s4 = new String("abc");

关于您的困惑:

  

令人困惑的是关于String in String

的java教程      

每当遇到代码中的字符串文字时,编译器   创建一个String对象及其值 - 在本例中为Hello world!。

上述陈述没有错。 它将创建4个String类对象,即s1,s2,s3,s4(上面的行正在讨论这些对象)

这里,s1和s2都将引用相同的值" abc",存在于字符串池中,而s3和s4将引用不同的" abc"值,在字符串池之外。

请参阅这两篇文章中的图片以获得更多说明。

http://www.journaldev.com/797/what-is-java-string-pool

http://www.journaldev.com/4098/java-heap-memory-vs-stack-memory-difference