【问题标题】:Shouldn't I do `String s = new String("a new string");` in Java, even with automatic string interning?我不应该在 Java 中执行 `String s = new String("a new string");`,即使使用自动字符串实习?
【发布时间】:2012-05-26 20:22:27
【问题描述】:

好的,这个问题是这个问题的延伸

Java Strings: "String s = new String("silly");"

上面的问题和这个问题问的一样,但是我有一个新的疑问。

根据Effective Java和上述问题的答案,我们应该String s = new String("a new string");,因为那会创建不必要的对象。

我不确定这个结论,因为我认为Java是在做automatic string interning,这意味着对于一个字符串,反正内存中只有一个副本。

让我们看看String s = new String("a new string");

"a new string" 已经是在内存中创建的字符串。

当我做String s = new String("a new string"); 时,那么s 也是"a new string"。所以根据automatic string internings应该指向"a new string"的同一个内存地址吧?

那我们怎么能说我们创造了不必要的对象呢?

【问题讨论】:

  • 只有字符串的一个副本除非你这样做new String(...)。除非必须,否则不要这样做。
  • +1 有趣的问题,从来没想过。但是,大多数情况下,您可以通过查看两个版本之间字节码的差异(或缺乏差异)来检查这些内容。
  • interning 仅在 String 文字上自动执行。
  • 因为还有一个字符串,所以new就是这么做的。
  • 是什么让您认为new String("a new string")"a new string" 更好?我不明白你为什么要使用前者。

标签: java string object string-interning


【解决方案1】:

String a = "foo"; // this string will be interned
String b = "foo"; // interned to the same string as a
boolean c = a == b; //this will be true
String d = new String(a); // this creates a new non-interned String
boolean e = a == d; // this will be false
String f = "f";
String g = "oo";
String h = f + g; //this creates a new non-interned string
boolean i = h == a // this will be false
File fi = ...;
BufferedReader br = ...;
String j = br.readLine();
boolean k = a == j; // this will always be false. Data that you've read it is not automatically interned

【讨论】:

    【解决方案2】:

    您可能想了解更多关于 JVM 中的字符串文字池。快速谷歌搜索将我指向这篇文章: http://www.xyzws.com/Javafaq/what-is-string-literal-pool/3 这似乎很有效。

    此外,您可能对整数字面量池以及 Java 中的其他字面量池感兴趣。

    【讨论】:

      【解决方案3】:

      使用“=”而不是“=new String”更好,因为它可能会导致单个实例而不是多个实例。

      【讨论】:

        猜你喜欢
        • 2010-09-24
        • 1970-01-01
        • 2012-06-05
        • 2012-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-13
        • 2011-01-29
        相关资源
        最近更新 更多