内存中将创build多less个string对象?
下面的代码将创build多less个string对象?
String s=""; s+=new String("a"); s+="b";
考试时我有这个问题。 我想知道正确的答案。 我说了2个对象。
包含“”,“b”的池中的对象和由新String(“a”)创build的对象;
我会去看另一个更清晰的问题:在下面的代码片段中涉及了多less个String实例:
String s=""; s+=new String("a"); s+="b";
答案是6:
- 空string文字:
""
; - string文字
"a"
; - string文字“a”的副本:
new String("a")
; - 通过连接
s
和"a"
的副本创build的string; - string文字
"b"
- 连接
s
和"b"
创build的string。
如果您认为三个string文字已经由以前加载的代码创build,则代码片段将创build3个新的String实例。
String s =“”;
不创build任何对象。
s + = new String(“a”);
创build五个对象。 new String
,StringBuilder和它的char []以及结果的String和它的char []
S + = “B”;
创build四个对象,StringBuilder和它的char []和String结果和它的char []
所以我总共得到了三个String对象的九个对象
注意:你可以确定“”已经加载,因为它出现在很多系统类中,包括ClassLoader和Class。
为了这个问题的目的,弦“a”和“b”不一定被认为是新弦。 恕我直言,我不会指望他们,因为他们最多只能创build一次,如果这个代码只运行一次,几乎没有多lessstring创build。 更有用的是知道每次运行代码时创build了多less个对象。
在JITC情况下实际创build的对象数量是不确定的。 JITC可能会认识到new String("a")
是一个标识,并且没有引用s
中间值,所以只有StringBuilder被创build。 在一般情况下(例如,在new String()
的参数可能无效的情况下),有一些潜在的副作用必须被模仿,但是文字是不可能发生的。
事实上,javac可以很好地认识到结果是“ab”,没有潜在的副作用,只是产生一个string的值。 (它在稍微不复杂的情况下进行串合并。)
创build新的string
早些时候,我们承诺要详细讨论创buildString的各种方法之间的细微差别。 我们来看几个如何创buildString的例子,我们进一步假设池中不存在其他的String对象:
String s = "abc"; // creates one String object and one reference variable
在这种简单的情况下,“abc”将进入池中,s将引用它。
String s = new String("abc"); // creates two objects, and one reference variable
在这种情况下,因为我们使用了
new
关键字,所以Java将在普通(nonpool)内存中创build一个新的String对象,s
将引用它。 另外,文字“abc”将被放置在池中。
从SCJP Sunauthentication程序员Java 6学习指南(考试310-065).pdf