为什么 String 类的 java 文档中没有介绍将创建多少个对象以及在哪里创建?
它被覆盖在字符串文档 http://docs.oracle.com/javase/7/docs/api/java/lang/String.html
String 类表示字符串。 Java 程序中的所有字符串文字(例如“abc”)都是作为此类的实例实现的。
字符串是恒定的;它们的值在创建后就无法更改。字符串缓冲区支持可变字符串。因为 String 对象是不可变的,所以它们可以共享。例如:
String str = "abc";
相当于:
char data[] = {'a', 'b', 'c'};
String str = new String(data);
并从Java语言规范 https://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.3.3
String 对象具有常量(不变)值。
字符串文字(第 3.10.5 节)是对 String 类实例的引用。
并从JSL#3.10.5。字符串文字 https://docs.oracle.com/javase/specs/jls/se8/html/jls-3.html#jls-3.10.5
此外,字符串文字始终引用 String 类的同一个实例。这是因为字符串文字 - 或者更一般地说,作为常量表达式值的字符串(第 15.28 节) - 被“保留”,以便使用 String.intern 方法共享唯一实例。
.
如果字符串是不可变的,为什么在 String 类中无论如何都会提供 new String(String) ?还可以假设由 String s = "abc" 或 String s = new String("abc") 创建的所有字符串都会可以在字符串常量池中使用吗?
由于 String 是对象,因此声明的有效方式是
String s = new String("abc");
但是哪里String s = "abc";
是出于其他原因而设计的
Java的设计者决定在面向对象的语言中保留原始类型,而不是把一切都变成对象,以提高语言的性能。
因为它是最有用的类,出于性能原因,Java 的 String 被设计为介于基元和类之间。
在 StringBuilder 或 StringBuffer 中创建或附加的字符串文字,它们是否也进入字符串常量池或仅保留在堆内存中。
考虑这个例子
StringBuilder sb = new StringBuilder("abc");
字面意思"abc"
常量池和对象中可用sb
在堆中创建。
尝试阅读我的旧答案:如何使用“”来初始化字符串? https://stackoverflow.com/questions/17489250/how-can-a-string-be-initialized-using/17489410#17489410