当引用类型相同时 - 数组

时间:2015-08-26 13:52:23

标签: java specifications java-6

我正在阅读JavaSE 6 specs,然后我做了一个测试来解决一些疑问。

  

两种引用类型是相同的运行时类型,如果:

     
      
  • 它们都是类或两种接口类型,由相同的类加载器定义,并且具有相同的二进制名称(§13.1),在这种情况下,它们有时被称为相同的运行时类或相同运行时界面。
  •   
  • 它们都是数组类型,它们的组件类型是相同的运行时类型 (§10)
  •   

运行以下代码......

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

我失踪了什么?

3 个答案:

答案 0 :(得分:2)

仅仅因为它们是同一类型,并不意味着它们是同一个对象。

当你这样做时

String[] strArr = {str};
String[] strArr2 = {str};

您正在创建两个由相同内容组成的数组,但数组本身是两个独立的对象。

它们是相同类型(字符串数组)但它们不是同一个对象(引用X和引用Y)。当你说strArr == strArr2时,你会问他们是否是同一个对象(或实例,如果你更喜欢这个术语)。

您引用的JLS与您所说的不同,它仅表示String[]String[]属于同一类型。

答案 1 :(得分:1)

您正在比较数组引用。

您的strArrstrArr2引用显然不相同。

您可以使用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