我正在阅读JavaSE 6 specs,然后我做了一个测试来解决一些疑问。
两种引用类型是相同的运行时类型,如果:
运行以下代码......
public class Test {
public static void main(String[] args) {
String str = "" + new String(" ");
String[] strArr = {str};
String[] strArr2 = {str};
System.out.println("strArr == strArr2 : " + (strArr == strArr2));
}
}
......我期待以下输出:
strArr == strArr2 : true
但目前的输出是:
strArr == strArr2 : false
我失踪了什么?
答案 0 :(得分:2)
仅仅因为它们是同一类型,并不意味着它们是同一个对象。
当你这样做时
String[] strArr = {str};
String[] strArr2 = {str};
您正在创建两个由相同内容组成的数组,但数组本身是两个独立的对象。
它们是相同类型(字符串数组)但它们不是同一个对象(引用X和引用Y)。当你说strArr == strArr2
时,你会问他们是否是同一个对象(或实例,如果你更喜欢这个术语)。
您引用的JLS与您所说的不同,它仅表示String[]
和String[]
属于同一类型。
答案 1 :(得分:1)
您正在比较数组引用。
您的strArr
和strArr2
引用显然不相同。
您可以使用Arrays.equals(strArr, strArr2)
来比较这些值。
如果您使用值strArr2
初始化strArr
,则您的参考比较将成立。
此外,比较数组类型(strArr.getClass() == strArr2.getClass()
)将适用于任何一种方式。
答案 2 :(得分:1)
汇总:
参考类型String[]
与参考类型String[]
相同,即
strArr.getClass() == strArr2.getClass() // true
strArr
的实例String[]
与同一类型的另一个实例strArr2
不同,即
strArr == strArr2 // false