2 回答

TA貢獻(xiàn)1784條經(jīng)驗 獲得超7個贊
TreeMap使用compareTo,并且如果不符合(即應(yīng)該是真的),文檔會警告您出現(xiàn)問題。compareToequalsa.compareTo(b) == 0 <=> a.equals(b)
請注意,如果此排序的映射要正確實現(xiàn) Map 接口,則樹映射維護(hù)的排序 ... 必須與 equals 一致。
LinkedList使用equals.
之所以TreeMap必須使用與 一致的排序,equals是因為 的契約 用 來Map定義行為equals。例如,containsKey定義為:
true當(dāng)且僅當(dāng)此映射包含一個鍵的映射k時才返回(key==null ? k==null : key.equals(k))
假設(shè)您定義了一個這樣的類:
class Bad implements Comparable<Bad> {
@Override public int compareTo(Bad other) { return 0; }
}
如果你要寫:
Bad b1 = new Bad();
Bad b2 = new Bad();
然后:
Map<Bad, String> hm = new HashMap<>();
hm.put(b1, "");
System.out.println(hm.containsKey(b2)); // false
然而
Map<Bad, String> tm = new TreeMap<>();
tm.put(b1, "");
System.out.println(tm.containsKey(b2)); // true
盡管事實上
System.out.println(tm.keySet().stream().anyMatch(k -> k.equals(b2))); // false
因此,TreeMap違反了 的合同Map,因為Bad沒有Comparable與 一致地執(zhí)行equals。

TA貢獻(xiàn)1856條經(jīng)驗 獲得超17個贊
的 JavadocTreeMap
并LinkedList
回答了這個問題:
V java.util.TreeMap.get(對象鍵)
返回指定鍵映射到的值,如果此映射不包含該鍵的映射,則返回 null。
更正式地說,如果此映射包含從鍵 k 到值 v 的映射,使得鍵根據(jù)映射的 ordering 比較等于 k,則此方法返回 v;否則返回null。(最多可以有一個這樣的映射。)
和
boolean java.util.LinkedList.contains(Object o)
如果此列表包含指定元素,則返回 true。更正式地說,當(dāng)且僅當(dāng)此列表包含至少一個元素 e 滿足 (o==null ? e==null : o.equals(e)) 時,才返回 true。
因此, for TreeMap
Comparator\Comparable 實現(xiàn)用于確定鍵的相等性,而 for LinkedList
sequals
用于。
添加回答
舉報