【问题标题】:How many Java objects are generated by this - new String("abcd")这个生成了多少Java对象 - new String("abcd")
【发布时间】:2011-07-08 17:35:35
【问题描述】:
String s = new String("abcd");

【问题讨论】:

  • (有趣的事实:如果你有String abcd = "Xabcd".substring(1);,那么通常(取决于实现)String s = new String(abcd); 将创建两个对象。)
  • objects而言,所有答案实际上都是错误的。 String 的创建有时包括创建包含其数据的char[]。这里它只发生在第一个 String (其他共享数组),所以你需要添加 1.

标签: java string object


【解决方案1】:

您正在创建一个对象。 JVM 将在幕后创建另一个对象,因为它interns 是在类加载时由常量创建的字符串,但这是 JVM 的事情(还没有向 intern 提出要求) .更重要的是,您可以相当肯定地完成了:

String s1 = new String("abcd");

一次,然后

String s2 = new String("abcd");

只会创建一个对象。

JVM 在类加载时创建另一个(第一个)String 对象:编译器将字符串放在string constants area.class 文件中。加载类时,它们是read into the class's constant poolinterned

所以当那行代码执行时,会创建一个String。但是在类中包含该行的事实会产生两个:一个用于加载类时创建的常量,另一个用于该行代码。

【讨论】:

    【解决方案2】:

    实习生池中有一个字符串,每次运行代码都会重复使用。

    然后是每次运行该行时都会构造的额外字符串。比如:

    for (int i = 0; i < 10; i++) {
        String s = new String("abcd");
    }
    

    将在内存中以 11 个字符串结尾,内容为“abcd” - 被保留的一个和 10 个副本。

    【讨论】:

    • +1:我认为“abcd”是在加载类时创建的,所以在执行此行时不会创建。
    • @Peter:是否可以保证实际创建 String 对象的时间点?我快速浏览了 JVM 规范,但看不到任何东西 - 任何参考都会很方便。
    • 字符串字面量是类定义的一部分,但你是对的,它可能在需要之前不会加载字面量。
    • @JonSkeet 很遗憾,JonSkeet 先生,我不明白你能解释一下为此String s = new String("abcd");创建了多少字符串
    • @Selva:嗯,这总是会创建一个新字符串(它正在调用构造函数),并且它还需要“abcd”在字符串池中。
    猜你喜欢
    • 2018-04-28
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    相关资源
    最近更新 更多