执行以下语句时会创建多少个对象?
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!。
使用“随时”在这里令人困惑。所以真正的问题是我们可以做些什么来让人们编辑教程来纠正它。否则它会让很多人感到困惑,毕竟这个网站甚至被有经验的专业人士引用。
答案 0 :(得分:3)
你提到的Java教程是错误的,因为它没有考虑String interning。
您确认它将是三个对象
答案 1 :(得分:0)
你对对象的创建是正确的,它会创建三个对象!!!
答案 2 :(得分:0)
它会创建3个对象
对象#1:
String s1 = "abc";
String s2 = "abc";
对象#2:
String s3 = new String("abc");
对象#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