我有两个陈述:
String aStr = new String("ABC");
String bStr = "ABC";
我在书中读到,在第一个语句中,JVM创建了两个对象和一个引用变量,而第二个语句创建了一个引用变量和一个对象。
那是怎么回事?当我说新的字符串(“ABC”)时,很明显对象是创建的。 现在我的问题是,对于“ABC”值,我们会创建另一个对象吗?请在此澄清一点。
谢谢
答案 0 :(得分:2)
使用字符串文字只会为JVM的生命周期创建单个对象 - 或者可能是类加载器。 (我不记得确切的细节,但它几乎不重要。)
这意味着很难说代码示例中的第二个语句确实“创建”了一个对象 - 某个对象必须存在,但是如果你在循环中运行相同的代码100次,它就不会创建任何更多对象......而第一个语句会。 (这需要“ABC”文字引用的对象存在并且通过调用构造函数在每次迭代时创建一个新实例。)
特别是,如果你有:
Object x = "ABC";
Object y = "ABC";
然后保证(通过语言规范)而不是x
,而y
将引用同一个对象。这也延伸到等于同一个字符串的其他常量表达式:
private static final String A = "a";
Object z = A + "BC"; // x, y and z are still the same reference...
我唯一一次使用String(String)
构造函数的方法是,如果我有一个字符串,可能会被一个我不需要的相当大的字符数组支持:
String x = readSomeVeryLargeString();
String y = x.substring(5, 10);
String z = new String(y); // Copies the contents
现在,如果y
和x
引用的字符串符合收集条件,但z
引用的字符串不符合(例如,它传递给其他方法等)我们最终不会将所有原始长字符串保存在内存中,否则我们会这样做。
答案 1 :(得分:2)
你最终会得到两个字符串。
1)文字“ABC”,用于构建aStr
并分配给bStr
。编译器确保这是相同的单个实例。
2)一个新构造的字符串aStr
(因为你强迫它是新的,这实际上非常不合情理)