根据您使用的 JVM/JRE,可能会出现以下错误。无论如何,最好不要担心这样的事情。如有任何更正/疑虑,请参阅评论部分。
首先,这个问题确实询问了这里解决的问题:字符串文字池是字符串对象引用的集合,还是对象的集合
因此,这是针对此事的每个人的指南。
...
鉴于这行代码:String s = new String(“xyz”)
有两种看待这个问题的方法:
(1) 当代码行执行时会发生什么——即它在程序中运行的时刻?
(2) 多少的净效应是多少?Objects
是由语句创建的?
Answer:
1) 之后executes,创建了一个附加对象。
a) The "xyz"
String
当 JVM 加载时创建并保留class
这行代码包含在.
- If an
"xyz"
已经在其他代码的实习池中,那么文字可能不会产生新的String
object.
b) 新的时候String s
创建后,内部char[]
是实习生的副本"xyz"
string.
c) 这意味着,当该行executes,仅创建了一个附加对象。
事实是"xyz"
类加载后且此代码段运行之前,对象就会被创建。
...下一个场景...
2)代码创建了三个对象(包括实习生"a"
)
String s1 = "a";
String s2 = "a";
String s3 = new String("a");
a) s1 和 s2 只是引用,不是对象,并且它们指向同一个String
在记忆中。
b) “a” 被保留并且是一个复合对象:一个char[]
对象和String
对象本身。它由内存中的两个对象组成。
c) s3, new String("a")
又产生一个对象。新的String("a")
不复制char[]
对于“a”,它仅在内部引用它。这是方法签名:
public String2(String original) {
this.value = original.value;
this.hash = original.hash;
}
实习生1人String
("a")
等于 2Objects
。还有一个new String("a")
等于多了一个对象。代码的最终效果是三个对象。