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的评论,现在我发现这是我的误解。非常感谢。