java使用新运算符时有多少字符串对象
当我们使用new操作符创建一个String对象时,我看到创建了两个对象,一个是String常量池,另一个是堆内存
我的问题是,我们使用的是新操作符,因此堆中只应创建一个对象。那么为什么还要在字符串常量池中创建一个对象呢。我知道每当我们不使用新操作符创建字符串时,Java都会存储String对象。例如:
String s = "abc" .
在这种情况下,它只会在字符串常量池中创建
String s2 = new String("abc")
只需在堆中创建一个对象,而不必在常量池中创建
请解释我为什么错了
# 1 楼答案
java中的字符串是不可变的,一旦创建,它就不能更改。此外,任何字符串文字都将存储在字符串池中,以便以后再次使用相同文字时使用,例如:
这两个引用引用池中的同一位置
这里我们在内存中有两个不同的字符串对象,每个对象都有自己的值
有关更多信息,请参阅本文: http://www.javaranch.com/journal/200409/Journal200409.jsp#a1
# 2 楼答案
见http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.28
所以当你写作的时候
编译时常量表达式“abc”将是interend
# 3 楼答案
下面这行代码将在JVM中创建3个对象
String
池内存中的"abc"
李>s2
一个李># 4 楼答案
它将在堆内存中只创建一个对象。我们需要使用java的
intern()
方法。lang.String显式地在字符串池中创建条目这里将创建两个对象。当您使用Java的字符串文字表示法创建时,它会自动调用
intern()
方法将该对象放入字符串池,前提是该对象尚未出现在该池中# 5 楼答案
当然
new
操作只创建一个对象。但是它的参数是一个字符串文本,它已经代表了一个对象。无论何时使用字符串文字,都会在类加载期间为此创建一个对象(除非在其他地方已经使用了相同的文字)。这并不是因为您将对象用作new String()
操作的参数而跳过的正因为如此,
new String()
操作在大多数情况下是不必要的,很少使用# 6 楼答案
它将被创建为两个对象,一个对象进入池区域,另一个对象进入非池区域,因为您正在使用new and以及string literal作为参数