当我们可以创建String s ="abc"时,需要String s = new String("abc")

har*_*der 6 java string

据我所知

String s = new String("abc") 将创造两个对象 -

  1. String常量池中的一个(如果"abc"尚未在常量池中)
  2. 一个在堆内存中

虽然存在关于实际创建多少个对象以及在何处创建的理解.

无论如何,我有以下问题 -

  1. 为什么在String类的java文档中没有涉及将创建多少个对象以及在哪里?
  2. 为什么new String(String)在String类中提供了为什么字符串是不可变的?.也可以假设所有由String s = "abc"或创建的字符串String s = new String("abc")都可以在String常量池中使用?
  3. 在创建或附加的字符串文字中,StringBuilder或者StringBuffer它们也在字符串常量池中,或者它们仅保留在堆内存中.

编辑

intern()方法的java文档清楚地讨论了常量池,但没有任何内容可以这样说String(String).

Sur*_*tta 7

为什么在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堆中创建的对象.

尝试阅读我的旧答案:如何使用""来初始化字符串?

  • Downvoted.没有真正回答这个问题并且是错误的.从char数组创建String并不等同于使用常量.示例:```String a ="x"; 字符串b ="x"; char [] ca = {'x'}; String c = new String(ca);```变量a和b现在指向同一个对象,但c指向不同的对象.此外,Java Strings是对象.它们不是"原始类型和引用类型之间".是的,您可以使用+运算符,但这只是语法糖,与"性能原因"无关.关于"有效的宣言方式"的东西没有意义. (2认同)
  • @JonaChristopherSahnwaldt那很好. (2认同)