2014-10-11 42 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是字符數組。