【问题标题】:string object creation and its constructor字符串对象创建及其构造函数
【发布时间】:2013-04-05 20:59:23
【问题描述】:

创建String对象有两种方式。

String str = new String("Java");
String str2 = "Java";

我知道在第一种情况下肯定会调用构造函数。但不知道第二个。 会调用构造函数吗?

String substr = new String(str.substring(2,str.length));  // str is new object
String substr2 = new String(str2.substring(2,str2.length)); //str2 is not with new keyword

想确保substrsubstr2 在堆内存中是相同类型的操作和相同的行为。

我知道String.substring() 根本不创建新对象,而是使用具有不同偏移量的先前 char[] 对象。

那么substrsubstr2 会发生什么?我们可以将这些东西与构造函数联系起来,因为偏移量是在构造函数内部生成的吗?

【问题讨论】:

  • @NPE 我会问这样的问题只是为了很好地理解语言。

标签: java


【解决方案1】:

来自 JLS §3.10.5. String Literals

字符串文字是对 String 类实例的引用(第 4.3.1 节、第 4.3.3 节)。

此外,字符串字面量总是引用类String 的同一个实例。这是因为字符串字面量 - 或者更一般地说,作为常量表达式值的字符串(第 15.28 节) - 是“内部”的,以便使用 String.intern 方法共享唯一实例。

因此,"Java" 指的是 String 对象。此外,任何由相同字符组成的字符串文字都将引用相同的String 对象。但是,该对象的构造方式和时间尚未确定。

要确保substrsubstr2 在堆内存中是相同类型的操作和相同的行为。

是的,它们是完全一样的操作。

我知道String.substring() 根本不会创建新对象,而是使用具有不同偏移量的先前 char[] 对象。

这是未指定的。您所描述的是旧版本的 Oracle JDK 是如何工作的。当前版本don't do that anymoresubstring() 现在复制字符。此更改是在 Java 7u6 中进行的。

【讨论】:

  • @AmitG:我认为当前的答案解决了您问题的每一点。
  • 您能否参考“当前版本不再那样做”的链接。无论如何,我现在正在谷歌搜索......
【解决方案2】:

在创建任何对象时调用构造函数。

如果是String str2 = "World";,jvm会先在字符串池中搜索字符串"world"。只有当池中不存在此字面量时才会调用构造函数,否则它将返回现有对象。

【讨论】:

  • 无论是任何可能的文字,逻辑都是一样的。
【解决方案3】:

应始终调用构造函数。 要亲自调试此应用程序:

public static void main(String[] args) {
  String str = new String("Java"); // <-- breakpoint here
  String str2 = "World";
  String str3 = "Java"; // (1)
  String str4 = new String("Java"); // (2)

  System.out.println(str + " " + str2 + " " + str3 + " " + str4);
}

在第一行 (String str = new...) 设置断点并“Step into”进入String() 构造函数。然后“Step out”构造函数,“Step over”到下一行并再次“Step into”。您应该再次在 String() 构造函数中。

1:对于str3,它应该来自池,即if (str3 == str)将是true

2:但str4 将是一个新实例,即if (str4 == str || str4 == str3) 将是false。请参阅String API

让我们知道你发现了什么:-)

【讨论】:

  • 这不是一个笼统的答案,请尝试添加 String str3 = "World";
  • 请查看我更新的问题。我再次将“World”更改为“Java”。
  • 检查更新的示例,特别是 str4 和 String API。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 2018-04-01
相关资源
最近更新 更多