2015-02-24 78 views
3

Objectequals方法只是比較地址:爲什麼Java中沒有「Equlable」接口?

public boolean equals(Object obj) { 
    return (this == obj); 
} 

我認爲這不是在大多數情況下是有用的,我們可以將其覆蓋。但對於我所開發的最職業,我沒有覆蓋equals方法,因爲我不會用它在所有...

所以我只是想知道,爲什麼Java語言的設計者把equals方法Object? 爲什麼沒有像「Comparable」這樣的「Equalable」界面?

+0

即使不覆蓋對象,知道一個物體總是等於本身是徹底有用。 – chrylis 2015-02-24 10:41:22

+1

可能的設計者認爲默認的'equals'(和'hashCode')行爲通常是可用的(人們可以在需要的地方覆蓋它),而默認的'compareTo'實現通常不會有用,因爲並不是真的一般物體的自然排序。 – khelwood 2015-02-24 10:41:35

+0

2件事情可以相等或不相等。它們可能不具可比性,但仍然意味着它們不相等。 – Ankit 2015-02-24 10:52:31

回答

4

身份提供平等的普遍定義。每個對象都等於自己。它在邏輯上可能與某些不是自己的對象相同,也可能不相同。如果是,請覆蓋equalshashCode。如果沒有,繼承Object

這就是被比較的有很大不同。一個類可能表示的結構可能缺乏任何有意義的總體順序 - 考慮複數。

4

equals()方法是由Java系統類使用的,例如在HashMap中。由於每個對象都可以存儲在HashMap中,因此每個對象都需要一個equals()方法。默認實現就足夠了。

這只是一個例子。有很多地方調用equals()。

+2

每個對象還可以被放置在一個'TreeMap' - 然而,它不是'Comparable'(和將引發異常)'設置 S =新TreeSet中<>(); s.add(new Object());'會編譯得很好 – amit 2015-02-24 10:43:25

+0

在每個對象中都有一個equals()和hashCode()方法是在TreeMap出現之前做出的一項設計決策。 – 2015-02-24 10:48:41

+1

@amit HashMaps和Lists比TreeMaps更經常使用。 'equals'也有一個健全的默認實現,其中沒有'compare'。將樣板默認的'equals'方法添加到幾乎每個類都會非常不方便 - 或者爲第三方類創建封裝 – Kapep 2015-02-24 10:50:59

1

要是Java接口「Equalable」之類的接口「可比」它不會是強制性的,包括它在Java中的每個對象,因此增加一個對象時,進入收集等可能出現新的問題。

當然和哈希碼+等於合同模式將被打破

請從有效的Java

檢查此鏈接

http://www.ideyatech.com/2011/04/effective-java-equals-and-hashcode/

+0

同樣適用於可比較的。 'Set s = new TreeSet <>(); s.add(new Object());'會編譯得很好,但拋出一個異常。 – amit 2015-02-24 10:45:18

+0

@amit但是,當創建每個集合時,你將不得不使用自定義的「equalators」。 – user11153 2015-02-24 11:21:09