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

时间:2015-10-17 08:15:39

标签: java string

根据我的理解

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

  1. String常量池中的一个(如果"abc"尚未处于常量池中)
  2. 堆内存中的一个
  3. 虽然存在关于实际创建多少个对象以及在哪里创建的理解。

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

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

      修改

           

      intern()方法的java文档清楚地讨论了常量池但是   在String(String)中没有任何说法。

2 个答案:

答案 0 :(得分:7)

  

为什么在String类的java文档中没有涉及将创建多少个对象以及在哪里?

它包含在Docs of String

  

String类表示字符串。 Java程序中的所有字符串文字(例如“abc”)都实现为此类的实例。   字符串是不变的;它们的值在创建后无法更改。字符串缓冲区支持可变字符串。因为String对象是不可变的,所以可以共享它们。例如:

 String str = "abc";
  

相当于:

 char data[] = {'a', 'b', 'c'};
 String str = new String(data);

来自Java language specification

  

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

尝试阅读我的旧答案:How can a string be initialized using " "?

答案 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常量池中,或者它们只保留在堆内存中。

编译器将所有字符串文字放在常量池中。