可以通过引用分开但相同的数组EVER相等

时间:2014-10-11 19:55:09

标签: java arrays

在java中,如果你有两个内容相同的数组,但它们是单独构造的,array1 == array2将为false,因为equals会进行引用检查,并且它们的引用是不同的。但它是否保证他们总会有不同的参考?例如

public class TestArrayReferences {
    private static final String[] SENTINEL_ARRAY_1 = new String[0];
    private static final String[] SENTINEL_ARRAY_2 = new String[0];

    public static boolean testArrays() {
        return SENTINEL_ARRAY_1 == SENTINEL_ARRAY_2;
    }
}

如果我调用testArrays,我返回false,但保证总是假的吗?也就是说,JVM是否允许检测SENTINEL_ARRAY_1和SENTINEL_ARRAY_2将始终相同,因此它们引用相同的数组?

3 个答案:

答案 0 :(得分:2)

假设它们都是通过分配新数组而不是通过赋值创建的,那么它们不能是引用相同的。

数组不像字符串那样被实现,因此创建一个新数组会在内存中创建一个新项目。这就是为什么你可以创建几个相同长度的int新数组,并将项目添加到一个而不将它们添加到另一个。

编辑:还注意到字符串是不可变的,这就是为什么它们可以被实习并且不会遇到问题的原因。如果字符串是可变的,实习将无法工作:

String s1 = "Hello";
String s2 = "Hello";
s1.setchar(0, 'J'); // fictional method to change one char of a String

如果存在这种方法,并且字符串被实习,那么s2也将被设置为" Jello",除非进行某种类型的实施。

答案 1 :(得分:1)

使用new关键字初始化数组时,会在堆中分配一块内存,并且您的引用指向它。除非其他引用指向堆中的相同内存空间,否则double equal运算符的结果将为false。

在您的情况下,两个不同的内存块被分配给两个不同的引用,因此,结果将为false,并且在满足上述条件之前始终为false。

答案 2 :(得分:0)

当您声明一个数组时,您正在分配'你的内存中有一个固定数字地址,由该数组使用,其长度无关紧要。

String[] arr1; // Gets allocated, for example, in memory address 0x04383833
String[] arr2; // Gets allocated, for example, in memory address 0x012A3A03

0x04383833永远不会等于(==)到0x012A3A03

是的,对于您的问题,如果与双倍相等,它们将始终返回false。

这正是我们在比较字符串时使用.equals方法而不是双等号,字符串是字符数组的原因。