2014-03-06 54 views
2

在Java中,爲什麼List<T>.indexOf(Object o)方法使用參數的equals方法而不是<T>的equals方法。爲什麼List.indexOf使用傳入Object的equals方法?

這是它是如何編碼:

public int indexOf(Object o) { 
if (o == null) { 
    for (int i = 0; i < size; i++) 
    if (elementData[i]==null) 
     return i; 
} else { 
    for (int i = 0; i < size; i++) 
    if (o.equals(elementData[i])) 
     return i; 
} 
return -1; 
} 

這是我希望它的工作:

public int indexOf(Object o) { 
if (o == null) { 
    for (int i = 0; i < size; i++) 
    if (elementData[i]==null) 
     return i; 
} else { 
    for (int i = 0; i < size; i++) 
    if (elementData[i].equals(o)) 
     return i; 
} 
return -1; 
} 

做第二次當第二個for循環就需要做更多的null檢查避免任何NullPointerException的方法。這是唯一的原因嗎?

+5

它爲什麼重要? 「equals」被指定爲對稱的。 –

+0

你只改變了通話的順序嗎? 'e.equals(o)'vs'o.equals(e)'?我們已經知道'o'不是'null'。還有@Louis說的。 ^^^^^ –

+0

不是沒有更多的空檢查需要足夠的理由足夠的事實嗎? – Keppil

回答

1

ArrayList擁有它的方式,它避免了空檢查。我沒有看到任何其他原因。如果您在elementData[i]上撥打等號,則必須檢查每個元素是否爲空。

現在,這裏的重要部分是,等於可以調用的兩種方式應該沒有區別。

  • 首先,因爲調用的實際等於方法在運行時由實際類型o確定。

這意味着,例如,如果傳遞indexOf字符串,重寫的等於字符串的方法被調用時,即使的o引用類型是對象。

它是對稱:對於任何非空引用值Xÿx.equals(y)的應返回當且僅當y.equals (x)返回true

如果equals方法正確實現,那麼您調用它的對象將不會產生任何影響。

+0

這個答案最有意義。 – aglassman

0

問題「爲什麼」就是這樣,只能由執行List類的人來回答。我會說像路易斯;它並不重要,因爲.equals被指定爲對稱。一個合理的猜測是它確保使用你提供的對象的.equals實現。

但是,如果您希望其行爲發生變化,您可以隨時使用自己的實現覆蓋它。

-2

對於對象java指定.equals()方法,因爲它們不能直接通過'=='進行比較。 如果使用簡單的原始數據類型'=='可以使用。 原始數據類型不具有.equals()方法。

+1

請澄清這與問題的關係。 –

0

這與繼承有關。我們會說Object o(參數)是Cat對象的一個​​實例。 Cat類和其他所有類都是Object的後代,因此Cat必須具有所有與Object相同的公共方法。在Cat中,我們也覆蓋了由Object聲明的equals(Object other)方法。 Cat有其自己的方式,它檢查它是否等於另一個對象。如果沒有,你將無法從AppleCarburetor使用equals()

列表,或者說你正在使用哪個目錄的執行(可能的ArrayList)標識內Object o告訴從Dog一個Cat其內容採用oequals()方法。由於(在我們的示例中)oCat對象,因此o需要知道列表中的每個項目是否是同一事物,並且必須檢查特定於Cat的值。當Cat.equals(Object other)返回true時,List.indexOf(Object o)將返回它所在的索引。

另一種可能有用的方法是考慮Object.equals(Object other)如何檢查相等性。對象本身只比較兩個項目的內存地址。它沒有別的它可以比較。即使該對象實際上是Dog,如果Dog.equals(Object other)未被強制執行,它也無法智能地比較兩個狗。

相關問題