【问题标题】:Where a String saves when the object creation has a concatenation?当对象创建具有连接时,String 保存在哪里?
【发布时间】:2018-09-03 06:41:26
【问题描述】:

我们知道下面的字符串保存在字符串常量池中。

String a = "AB";

如下创建的String对象将保存在Heap中。

String b = new String("AB");

String e = b.concat("C");

此时, 谁能解释以下字符串的保存位置?

String c = new String("A"+ "B");

String d = "A" + "B";

如果你能清楚地解释原因,不胜感激。

【问题讨论】:

  • 如果你在谈论 Java,我相信 + 两个参数都是编译时常量的操作在编译时被解析 - 所以那些连接的字符串最终会在字符串常量池中。在您的示例中, c 的 String 构造函数的参数和 d 的值将是常量池中的相同常量。 c,OTOH,将是对在堆上分配的字符串的引用。

标签: string heap-memory string-pool


【解决方案1】:

在继续你的目标陈述之前,对你的问题进行一个小的更正。

String b = new String("AB");

String e = b.concat("C");

以上语句将在 Heap 和 String Pool 中创建一个 String 对象以供进一步引用。

现在你的第一个问题陈述:

String c = new String("A"+ "B");

这里,前两个字符串“A”和“B”在字符串池中创建,并连接形成“AB”,该“AB”也存储在字符串池中。 --->第一点

然后new String(dataString)构造函数以"AB"为参数被调用。这将在堆中创建一个字符串,在字符串池中创建一个,两者的值都为“AB”。 --->第二点

在 Point-I 和 II 的字符串池中创建的字符串 "AB" 是 equalnot the same

现在你的第二个问题陈述:

String d = "A" + "B";

这里有两种情况:

  1. 如果在第一条语句之后执行第二条语句,则不会在字符串池中创建新的字符串,因为“A”、“B”和“AB”已经存在于字符串池中,并且可以使用 Interning 重用
  2. 如果单独执行第二条语句,则最初在字符串池中创建两个字符串“A”和“B”,然后将它们连接形成“AB”,该“AB”也存储在字符串池中。

希望这能回答您的问题。干杯!

【讨论】:

  • 感谢您的澄清。 :)
猜你喜欢
  • 2018-11-11
  • 1970-01-01
  • 2014-01-14
  • 1970-01-01
  • 1970-01-01
  • 2020-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多