据我所知
String s = new String("abc") 将创造两个对象 -
"abc"尚未在常量池中)虽然存在关于实际创建多少个对象以及在何处创建的理解.
无论如何,我有以下问题 -
new String(String)在String类中提供了为什么字符串是不可变的?.也可以假设所有由String s = "abc"或创建的字符串String s = new String("abc")都可以在String常量池中使用?StringBuilder或者StringBuffer它们也在字符串常量池中,或者它们仅保留在堆内存中.编辑
intern()方法的java文档清楚地讨论了常量池,但没有任何内容可以这样说String(String).
为什么在String类的java文档中没有涉及将创建多少个对象以及在哪里?
它包含在字符串文档中
String类表示字符串.Java程序中的所有字符串文字(例如"abc")都实现为此类的实例.字符串是不变的; 它们的值在创建后无法更改.字符串缓冲区支持可变字符串.因为String对象是不可变的,所以可以共享它们.例如:
String str = "abc";
Run Code Online (Sandbox Code Playgroud)
相当于:
char data[] = {'a', 'b', 'c'};
String str = new String(data);
Run Code Online (Sandbox Code Playgroud)
并且来自Java语言规范
String对象具有常量(不变)值.
字符串文字(第3.10.5节)是对String类实例的引用.
并且来自JSL#3.10.5.字符串文字
此外,字符串文字始终引用类String的相同实例.这是因为字符串文字 - 或者更常见的是作为常量表达式(第15.28节)的值的字符串 - 被"实例化"以便使用String.intern方法共享唯一实例.
.
为什么在String类中提供新的String(String)提供的字符串是不可变的?.也可以假设由String s ="abc"或String s = new String("abc")创建的所有字符串都将在String常量池中可用吗?
由于String是对象,因此有效的声明方式是
String s = new String("abc");
Run Code Online (Sandbox Code Playgroud)
但是String s = "abc";出于其他原因设计的地方
Java的设计者决定将原始类型保留在面向对象的语言中,而不是将所有东西都作为对象,从而提高语言的性能.
因为它是最有用的类出于性能原因,Java的String被设计在原语和类之间.
在StringBuilder或StringBuffer中创建或附加的字符串文字是否也在String常量池中,或者它们仅保留在堆内存中.
考虑这个例子
StringBuilder sb = new StringBuilder("abc");
Run Code Online (Sandbox Code Playgroud)
"abc" 常量池中可用的文字和sb堆中创建的对象.
尝试阅读我的旧答案:如何使用""来初始化字符串?