TreeMap
использует compareTo
, а документация предупреждает вас о проблемах, если compareTo
не соответствует equals
(то есть, что a.compareTo(b) == 0 <=> a.equals(b)
должно быть истинным).
Обратите внимание, что порядок, поддерживаемый древовидной картой ... должен быть в соответствии с равным , если эта отсортированная карта предназначена для правильной реализации интерфейса карты.
LinkedList
использует equals
.
Причина, по которой TreeMap
должен использовать порядок в соответствии с equals
, заключается в том, что контракт Map
определяет поведение в терминах equals
.Например, containsKey
определяется как:
возвращает true
тогда и только тогда, когда эта карта содержит отображение для ключа k
, такое, что (key==null ? k==null : key.equals(k))
Допустим, вы определили класс следующим образом:
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
в соответствии сequals
.