使用new运算符的多少String对象

当我们使用new运算符创建一个String对象时,我读到创建了两个对象,一个Object是字符串常量池,第二个是堆内存。

我的问题是我们正在使用new运算符,因此只应在Heap中创建一个对象。 为什么然后必须在String Constant池中创建另外一个对象。 我知道只要我们不使用new运算符来创建String,Java就会存储String对象。 例如:

String s = "abc" . 

在这种情况下,它只会在String常量池中创建。

 String s2 = new String("abc") 

只有一个对象可以在堆中创建,而不是在常量池中创建。

请解释我在这里错的原因。

我们正在使用new运算符,因此在Heap中只应创建一个对象。

当然 – new操作只创建一个对象。 但它的参数是一个String文字,它已经代表一个对象。 每次使用String文字时,都会在类加载期间为其创建一个对象(除非在其他地方已经使用了相同的文字)。 这不会被跳过,因为您随后将该对象用作new String()操作的参数。

因此, new String()操作在大多数情况下是不必要的,很少使用。

见http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.28

String类型的编译时常量表达式总是“实例化”,以便使用String.intern方法共享唯一实例

因此,当你写

 String s2 = new String("abc") 

编译时常量表达式“abc”将是相互作用。

它将创建两个对象,一个对象进入池区域,另一个对象在非池区域中,因为您使用new和string字符串作为参数。

 String s = new String("abs"); 

java中的字符串是不可变的,一旦创建它就无法更改。 此外,任何字符串文字都将存储在字符串池中,以便以后再次使用相同的文字时使用,例如:

 String name = "my name"; // one intern object is created in pool String otherName = "my name"; // the old intern object is reused System.out.println( name == otherName); // true , the same reference refer to same object 

两个引用指的是池中的相同位置。

 String name = new String("my name"); // one object is created, no string pool checking String otherName = new String("my name"); // other object is created, no string pool checking System.out.println( name == otherName); // false, we have 2 different object 

这里我们在内存中有两个不同的String对象,每个对象都有自己的值。

有关更多信息,请参阅此文章: http : //www.javaranch.com/journal/200409/Journal200409.jsp#a1

 String s2 = new String("abc") 

它将在堆内存中只创建一个对象。 我们需要显式地使用java.lang.String的intern()方法来在String池中创建条目。

 String s = "def". 

这里将创建两个对象。 当您使用Java的字符串文字表示法创建时,它会自动调用intern()方法将该对象放入字符串池中,前提是它已不存在于池中。

从下面的代码行开始,将在JVM中创建3个对象

 String s2 = new String("abc") 
  1. 对于String池内存中的"abc"
  2. 对于new运算符,堆中有一个对象。
  3. s2

String s2 = new String("abc");
这里将创建1个文字和1个对象。

使用new运算符1 String对象将在堆中创建为“abc”,s2将引用它,而且“abc”也是在字符串构造函数中传递的字符串文字,因此它将进入字符串常量池。

文字被视为对象,因此这里将创建2个对象。