2015-08-21 38 views
-1

我是問在接受採訪時的Java問題:爲什麼這兩個列表不相等?

List a = new ArrayList(); 
    a.add(a); 

    List b = new ArrayList(); 
    b.add(b); 

    if (a.equals(b)) { 
     System.out.println("equal"); 
    } else { 
     System.out.println("non-equal"); 
    } 

爲什麼結果是「非平等」?謝謝!

+5

在它的當前形式中,您的代碼不會導致「不等於」。它導致一個'StackOverflowException'。爲什麼?現在這將是一個很好的面試問題。 :) – sstan

+0

它應該是'b.add(b)'或'a.add(b)'?在實際的採訪中,它是什麼?因爲如果面試官說正確的輸出是「不相等的」,那麼它不是一個錯字,你不需要編輯這個問題 - 在這種情況下Emd4600有正確的答案。如果面試官只是說「這裏有什麼結果?」它*是* b.add(b)',那麼這是一個詭計的問題,Andreas有正確的答案。 – OhBeWise

回答

2
List a = new ArrayList(); 
a.add(a); 

List b = new ArrayList(); 
a.add(b); 

仔細看。 a現在有兩個項目(a和b),b沒有項目。所以a不等於b。

+1

這是一個錯字,但是檢查與b.add(b)的相等性實際上會導致StackOverflowError錯誤。 – Mena

0

[此答案是指POST進行編輯之前]

.equals該方法在兩個陣列列表的內容進行比較。 (若它們是同一個對象)

如果你仔細看,你使用的方法.add後,列表a有兩個要素(ab),而不是b:在沒有

的代碼沒有按」 t進入java.lang.StackOverflowError,因爲.equals方法首先檢查兩個列表的大小,然後檢查內容。

事實上,如果你試試這個代碼:

List a = new ArrayList(); 
    a.add(a); 
    List b = new ArrayList(); 
    b.add(b); // <-watch carefully here. Now a and b are of the same size 
    if (a.equals(b)) { // checks the size first, then the objects in the lists 
     System.out.println("equal"); 
    } else { 
     System.out.println("non-equal"); 
    } 

你得到java.lang.StackOverflowError

3

你的代碼(編輯後)的結果StackOverflowException因爲a包含本身b包含本身。

a.equals(b)將迭代列表並聯和比較每個元件,所以a.get(0).equals(b.get(0)),但a.get(0)ab.get(0)b和比較那些將遞歸的equals方法,循環往復。