根据我的理解
String s = new String("abc")
将创建两个对象 -
"abc"
尚未处于常量池中)虽然存在关于实际创建多少个对象以及在哪里创建的理解。
无论如何,我有以下问题 -
new String(String)
提供的字符串是不可变的?。也可以假设所有由String s = "abc"
或String s = new String("abc")
创建的字符串都可用于字符串常量池?StringBuilder
或StringBuffer
中创建或附加的字符串文字,它们是否也在String常量池中,或者它们只保留在堆内存中。修改
intern()
方法的java文档清楚地讨论了常量池但是 在String(String)
中没有任何说法。
答案 0 :(得分:7)
为什么在String类的java文档中没有涉及将创建多少个对象以及在哪里?
它包含在Docs of String
中String类表示字符串。 Java程序中的所有字符串文字(例如“abc”)都实现为此类的实例。 字符串是不变的;它们的值在创建后无法更改。字符串缓冲区支持可变字符串。因为String对象是不可变的,所以可以共享它们。例如:
String str = "abc";
相当于:
char data[] = {'a', 'b', 'c'};
String str = new String(data);
String对象具有常量(不变)值。
字符串文字(第3.10.5节)是对类String实例的引用。
来自JSL # 3.10.5. String Literals
此外,字符串文字始终引用类String的相同实例。这是因为字符串文字 - 或者更常见的是作为常量表达式(第15.28节)的值的字符串 - 被“实例化”以便使用String.intern方法共享唯一实例。
为什么在String类中提供新的String(String)提供的字符串是不可变的?。也可以假设所有字符串由String s =“abc”或String s = new String(“abc”)创建),将在String常量池中可用吗?
由于String是对象,因此有效的声明方式是
String s = new String("abc");
但String s = "abc";
的设计原因是出于其他原因
Java的设计者决定在面向对象的语言中保留原始类型,而不是将所有东西都作为对象,以便提高语言的性能。
因为它是最有用的类出于性能原因,Java的String被设计在基元和类之间。
在StringBuilder或StringBuffer中创建或附加的字符串文字,它们是否也在String常量池中,或者它们只保留在堆内存中。
考虑示例
StringBuilder sb = new StringBuilder("abc");
常量池中可用的文字"abc"
和堆中创建的对象sb
。
答案 1 :(得分:1)
String s = new String(“abc”)将创建两个对象:
- String常量池中的一个(如果“abc”不在常量池中)
没有。 是在常量池中。它由编译器放在那里。
- 堆内存中的一个
正确。
虽然存在多少关于实际创建的对象数量和位置的理解。
许多误解:只有一个正确的理解。
为什么在String类的java文档中没有涉及将创建多少个对象以及在哪里?
问题的前提是不正确的。它被覆盖了。不一定是“创建了多少个字符串”的确切形式,但是在过去的20年里,问题已经被问到数百万的时间,答案并不完全是秘密。或者不应该。
为什么在String类中提供新的String(String)提供的字符串是不可变的?。
所以你可以创建一个新的。
也可以假设由String s =“abc”或String s = new String(“abc”)创建的所有字符串都可以在String常量池中使用吗?
没有。只有字符串文字和?- parent_of(X,Y).
X = warren,
Y = jerry ;
X = maryalice,
Y = jerry ;
Y = ann ;
Y = kather ;
Y = maryalice ;
Y = jerry ;
Y = jerry ;
Y = jerry ;
Y = peter ;
Y = stuart ;
Y = kather ;
Y = warren.
的结果在常量池中。这也有记录。
在StringBuilder或StringBuffer中创建或附加的字符串文字,它们是否也在String常量池中,或者它们只保留在堆内存中。
编译器将所有字符串文字放在常量池中。