【问题标题】:In Java, does `String s = "lol";` create two objects? [duplicate]在 Java 中,`String s = "lol";` 会创建两个对象吗? [复制]
【发布时间】:2014-02-07 22:04:54
【问题描述】:

我听说执行String s = new String("lol"); 时会创建两个对象。为字符串常量池创建一个对象,在堆上为s 创建一个对象。

那么,当我们执行以下操作时,是否创建了 2 个对象? String s = "lol";对象创建一样吗?

编辑:

创建了多少对象: String s1 = new String("lol1");

还有多少: String s2 = "lol2";

【问题讨论】:

  • 实际上,常量池中的“lol”是在任何类中加载该值的第一个字符串文字时创建的——可能是 10 分钟前加载的类。并且简单地将对象引用值分配给对象引用变量不会创建任何对象。
  • 没有。一个是文字值,一个是对象。
  • @AlexJohnson - 字符串文字是一个对象。
  • @HotLicks 实际上,这就是为什么在 Java 获得像 C# 的 ?? 这样的空合并运算符之前,"expectedValue".equals(someStringVariableThatMayBeNull) 在现实世界中是一个非常有用的构造。 :)

标签: java string


【解决方案1】:

不,String s = "lol";只创建一个对象。对于每个字符串文字,都会创建一个 String 对象并将其放置在字符串池中。在这里,s 只是指那个池化字符串。当你说s = new String("lol") 时,字符串文字被创建和池化,另一个字符串被分配并分配给s,这是一个不同的equal 字符串。

更新

我忘记了 char[] 内部使用的 String 对象。

String s1 = "lol";

创建了 2 个对象,char[] 包含 {'l', 'o', 'l'}String 对象在内部引用它。它被保存在字符串池中。

String s2 = new String("lol");

创建了 3 个对象。首先,字符串文字: 2 个对象被创建,char[] 包含 {'l', 'o', 'l'}String 引用它的对象。它像以前一样被拘留在字符串池中。然后,分配给s2 的新String 对象:创建一个新的String,但它引用与原始字符串相同的字符数组。两个String 对象和一个char[] 对象。 String(String) 构造函数可能会在原始字符串的数组长度大于其count 的情况下复制char[],但这里似乎不是这种情况。)

【讨论】:

  • 实际上,如果前面引用“lol”的语句仍在类中,则创建了零个对象。在整个 JVM 中的任何地方(最多)只有一种文字值“lol”的表示。
  • @HotLicks 我将问题解释为这两个语句是不同的示例,而不是同一程序中的两行。
  • 你不会只得到一个,String 包装了一个 char[],所以很可能有两个,或者没有。
  • @PeterLawrey - 字符串不一定包含 char[]
  • 好的一个后续问题:为什么在String s2 = new String("lol");的情况下创建两个字符串对象?
【解决方案2】:

"lol"String 文字 - 当您在代码中引用它时,您会强制 Java 创建此对象。您看到的第二个对象是当您使用 new 运算符显式调用 String 的构造函数时。将这些值分配给其他变量不会创建其他对象。

【讨论】:

  • 需要注意的是,在 JVM 的整个生命周期中只会创建一个 "lol" 的实例,无论有多少类使用该字面量多少次。但是,new String 每次执行时都会创建一个新对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-26
  • 2014-09-02
相关资源
最近更新 更多