2012-04-30 76 views
1

發現這個網站大概測試崇拜者開發商...發生了什麼事情,並在此聲明平等嗎?

http://www.devchallenge.co.uk/challenge-2

問題是這樣的......

根據給定的代碼,它下面的測試將返回 'true'回答並通過,哪個會返回'false'的答案,並且會失敗?

ArrayList array1 = new ArrayList(); 
ArrayList array2 = new ArrayList(); 

array1.add(1); 
array1.add(2); 
array1.add("Aviva"); 

array2.add(1); 
array2.add(2.0); 
array2.add("Aviva"); 

Asserts 
    Equality 
     (array1[0],array2[0]); 

Asserts 
    Equality 
     (array1[1],array2[1]); 

Asserts 
    Equality 
     (array1[2],array2[2]); 

顯然,答案是 '失敗', '失敗', '合格'。

我不是Java開發人員 - 我假設這個挑戰在Java中(雖然沒有說明)。

平等做什麼?是否檢查相同的對象或相同的?我知道一些對象被插入Java中的String/Integer池中,所以我可以理解爲什麼最後一個是真的。但爲什麼第一個不是真的?

+0

這些斷言是僞代碼,所以沒有明確的答案。但我確定「平等」意味着「調用equals的結果」。 –

+0

@Marko是的,這就是我的想法 - 因此,你期望看到'平等(array1 [0],array2 [0])'產生真實?由於它們的值是相等的...... –

+1

是的。我去了那個網站,看起來像一些廢話。如果他們沒有給出具體的,可編譯的代碼,他們可以聲稱任何答案都是正確的。 –

回答

1

這不是有效的Java語法。您不能撥打Asserts Equality()

作爲JUnit測試中的斷言,這必須是Assert.assertEquals(array[0], array2[0]),這會導致比較兩個Integer s。所以這應該通過。

所以我不明白你提出的代碼的結果也。我會說通過,失敗,傳球是對的。

+0

是的,我想這肯定會更有可能... –

+0

剛剛檢查。斷言(1.0 == 1)在Java中傳遞,所以三重傳遞它是... – Miquel

+1

@Miquel:你在這裏沒有原始類型。這些值是自動裝入「整數」和「雙精度」的,因爲集合只能保存對象。這就是爲什麼斷言看起來是這樣的:'Assert.assertEquals(Integer.valueOf(1),Double.valueOf(1.0));'(返回FALSE)。 – Kai

1

如果標量是「自動裝箱」,那麼它們將擁有不同的對象所有者,所以對==的測試將是錯誤的,但是這些字符串將通過==測試,因爲編譯器確保相同的確切字符串作爲常數使用。如果你正在考慮一個.equals()測試,那麼他們都是平等的。

+0

我想這可能是C#(等),具備了從一開始,我認爲自動裝箱。 –

+0

在您看來,對於具有良好的Java知識的人來說,準確回答這個問題是否足夠清晰? –

+0

此外,整數不會被整合到整數池中,所以'=='會產生'true'嗎? –