根据我对String对象的理解,在String Constant Pool上添加/创建每个字符串文字。
String a = new String("hello world");
正在创建两个对象,一个是在常量池中添加的“hello world”,另一个是String的新实例。在StringBuilder中是否应用了相同的原理?
StringBuilder b = new StringBuilder("java is fun");
b.append(" and good");
StringBuilder示例中的是否表示正在创建3个对象?第一个是StringBuilder的新实例,另外两个对象是字符串文字“java is fun”和“and good”?
答案 0 :(得分:2)
是的,您的理解是正确的。 (但请参见下文。)字符串文字进入常量池,而new String(...)
和new StringBuilder(...)
创建其他对象。 (StringBuilder
还会创建一个内部字符数组对象,因此第二个示例中至少涉及四个对象。)请注意,对b.append(...)
的调用可能会在内部创建另一个对象和一些垃圾,但是仅当b
使用的内部字符数组需要扩展时。
编辑:作为@fdreger points out in a comment,对应于字符串文字的字符串对象不是在运行时创建的,而是在类生命周期的创建和加载阶段创建类时(如Java Language Specification中所述;另请参阅runtime constant pool上的部分。
答案 1 :(得分:0)
是的,你是对的。
"java is fun"
和" and good"
将存储在常量池中。我称之为物体,但是,它更像是它。
b
将成为寿命有限的对象。它实际上可以将它自己的两个字符串的副本存储在其缓冲区中以便使用,这样原件就不会被修改。
答案 2 :(得分:0)
字符串是在加载类时创建的,而不是在执行实际代码时创建的。您可以将它们视为代码的一部分,与任何其他字面值完全相同。
所以在你的第二个例子中: