Java 当引用类型相同时-数组
我在读书,然后我做了一个测试来解决一些疑问 两种引用类型是相同的运行时类型,如果:Java 当引用类型相同时-数组,java,specifications,java-6,Java,Specifications,Java 6,我在读书,然后我做了一个测试来解决一些疑问 两种引用类型是相同的运行时类型,如果: 它们都是类或接口类型,由相同的类加载器定义,并且具有相同的二进制名称,在这种情况下,它们有时被称为相同的运行时类或相同的运行时接口 它们都是数组类型,并且它们的组件类型是相同的运行时类型 正在运行下面的代码 public class Test { public static void main(String[] args) { String str = "" + new String(
- 它们都是类或接口类型,由相同的类加载器定义,并且具有相同的二进制名称,在这种情况下,它们有时被称为相同的运行时类或相同的运行时接口
- 它们都是数组类型,并且它们的组件类型是相同的运行时类型
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
我遗漏了什么?仅仅因为它们是相同的类型,并不意味着它们是相同的对象 当你这样做的时候
String[] strArr = {str};
String[] strArr2 = {str};
您正在创建由相同内容组成的两个数组,但数组本身是两个独立的对象
它们是相同的类型(字符串数组),但它们不是相同的对象(引用X和引用Y)。当你说strArr==strArr2
时,你是在问它们是否是同一个对象(或实例,如果你喜欢这个术语)
您引用的JLS与您所说的不同,它只是说
String[]
和String[]
是同一类型。您正在比较数组引用
您的strArr
和strArr2
引用显然不同
您可以使用Arrays.equals(strArr,strArr2)
比较这些值
如果使用值strArr
初始化strArr2
,则引用比较将保持为真
另外,比较数组类型(strArr.getClass()==strArr2.getClass()
)在任何情况下都是正确的 总结:
参考类型String[]
与参考类型String[]
相同,即
strArr.getClass() == strArr2.getClass() // true
String[]
的实例strArr
与同一类型的另一个实例strArr2
不同,即
strArr == strArr2 // false
对于您的代码,JLS只声明
strArr.getClass()==strArr2.getClass()
。您是在混合类型和变量吗?spex说明了类型,而您的示例是关于实例的。查看上面@dhke@JeroenVannel的评论,现在我发现这是我的误解。非常感谢。