2014-10-11 43 views
1

在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将始终相同,因此它们引用相同的数组?

+0

使用'java.util.Arrays'来比较数组 – msrd0 2014-10-11 19:58:10

+0

'new'总是表示“新”。 – 2014-10-11 20:12:03

+0

@ChrisMartin你是否有链接到任何官方规格(或声誉良好的来源),以确保新的永远是一个新的对象? – 2014-10-11 20:31:03

回答

2

假设它们都是通过分配新数组而不是通过赋值创建的,否则它们不能被引用完全相同。

数组并不像字符串那样被执行,因此创建一个新数组在内存中创建一个新项。这就是为什么您可以创建几个int长度相同的新数组,并将其添加到另一个,而无需将其添加到另一个。

编辑:还请注意,字符串是不可变的,这就是为什么他们可以被实施并且不会遇到问题。如果丝线可变的,实习是行不通的:

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

如果此方法存在,字符串被拘禁,然后S2也将被设置为“爽”,除非某种DIS-实习中完成的。

+0

感谢您的回复。我担心的是,JVM可以检测到这个数组从未被修改,或者一个空数组是不可变的,并且是一个例外。你不会碰巧有一个新的链接,保证你总是新的? – 2014-10-11 20:29:30

+0

来自JLS:数组创建表达式创建一个对象,该对象是一个新数组,其元素的类型由PrimitiveType或ClassOrInterfaceType指定。 (15.10.1) – 2014-10-11 20:33:31

+0

如果你想在实现中看到一个保证,你必须在grepcode上进行探索。祝你好运! – 2014-10-11 20:35:01

1

当您使用new关键字初始化一个数组时,会在堆中分配一块内存,并且您的引用指向它。直到或除非其他引用指向堆中的相同内存空间,否则双等号运算符的结果将是错误的。

在你的情况下,两个不同的内存块被分配给两个不同的引用,所以结果将是错误的,并且将始终为假,直到满足上述条件。

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方法比较字符串而不是double equals时的原因,Strings是字符数组。