【问题标题】:How many objects are created in the following Strings in Java [duplicate]在Java中的以下字符串中创建了多少个对象[重复]
【发布时间】:2016-06-19 20:41:29
【问题描述】:

可能重复:
How many java objects generated by this code? and why?

下面的我很迷茫

String s1 = new String("Java");
String s2 = new String("Java");

这里创建了多少对象?

String s1 = new String("Java");
String s2 = new String("Ruby");

这里创建了多少对象?

String s1 = new String("Java");
String s2 = "Java";

这里创建了多少对象?

String s1 = "Java";
String s2 = "Java";

这里创建了多少对象?

【问题讨论】:

  • 我不确定,但我认为是:3、4、2、1
  • @Augusto 你觉得第一个怎么样?
  • Coder:你的问题让我在谷歌上搜索了一下,你可以找到一个很好的解释here。如果您编写一些使用== 运算符检查字符串是否相同的代码,您可以轻松地对此进行测试。
  • @Augusto 谢谢你。看到人们的不同答案,我真的很困惑。您能否在此处发布答案,以便对其他人有所帮助:)

标签: java string object


【解决方案1】:

您的第一部分代码:

创建了 2 个对象。 如果字符串池中不存在“Java”,则会在其中创建并添加一个字符串。

您的第二部分代码:

创建了 2 个对象,如果字符串池中既不存在“Java”也不存在“Ruby”,则创建两个字符串并将其添加到其中。

您的第三部分代码:

创建了一个对象。并执行相同的条件以添加到字符串池。

您的第四部分代码:

如果字符串池中不存在“Java”,则仅创建一个对象。否则不会创建新对象。

【讨论】:

  • 你的答案是错误的,尝试运行一些代码来证明你的价值观,你会发现它不正确。
  • 回答有什么问题?我不计算添加到字符串池中的字符串,而只计算堆上的对象。
  • @Azodious Pooled String 也可能在堆上(它们在热点 1.7+ 上)。
  • @assylias:注意到了。在那种情况下,这个问题不可能有一个明确的答案。将取决于 StringPool 状态。 (即是否存在某些字符串)
  • 字符串池检查仅在您将字符串创建为字面量时执行,如果您使用 new() 运算符创建字符串,即使池中存在具有相同内容的字符串,也会创建一个新的字符串对象。阅读更多:javarevisited.blogspot.com/2012/10/…
【解决方案2】:
String s1 = new String("Java");
String s2 = new String("Java");

它将在堆中创建 2 个对象。

String s1 = new String("Java");
String s2 = new String("Ruby");

这将在堆中创建 2 个对象。

String s1 = new String("Java");
String s2 = "Java";

这将在堆中为第一行创建一个对象。 对于第二行,它将检查字符串池中是否存在“Java”。如果存在,则不会创建新字符串。它将返回对池中已存在字符串的引用

String s1 = "Java";
String s2 = "Java";

第一行将检查字符串池中是否存在“Java”。如果存在,则不会创建新字符串。它将返回对池中已经存在的字符串的引用。 第二行将获取对已创建字符串的引用。因此,如果“Java”存在或最多一个对象,则没有新对象

【讨论】:

  • 最后一段中提到的第一行没有检查任何内容。文字 is 在字符串池中,由编译器和类加载器放置在那里。
猜你喜欢
  • 1970-01-01
  • 2019-09-19
  • 2022-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-31
相关资源
最近更新 更多