我嘗試使用TreeMap
的containsKey
方法,但不知何故,我遇到了問題。treemap使用compareTo而不是equals for containsKey()
定義存儲在樹形圖中的對象,例如equals()
不能提供與compareTo()
相同的結果。這是有意的。
然而,java.util.Map
的醫生說:
返回true,如果此映射包含指定鍵的映射。更正式地說,當且僅當該映射包含關鍵字k的映射(如
(key==null ? k==null : key.equals(k))
)時才返回true。 (可以有至多一個這樣的映射。)
所以,我試圖以下:
c = someModifiedObject();
boolean t1 = sm.containsKey(c);
someObject c2 = new someObject();
boolean t2 = sm.containsKey(c2);
boolean t3 = c.equals(new Chain());
int t4 = c.compareTo(new Chain());
t1爲真,當對象是在樹形圖。 t3爲真,因爲t1等於t3(關於變化equals()
運營商) t4爲假 但是,t2也是錯誤的。看起來TreeMap
使用compareTo()
而不是equals()
來確定對象是否存在。
是否有排序映射的另一個實現,其中我可以使用equals()
來檢查對象是否存在?
使用使比較符合等於或更好的比較器,修復compareTo方法,使其與equals相等。與比較不一致的比較方法應該作爲比較器來實現,而不是該類的固有自然順序。 –
但該文檔還指出:_「Collections Framework接口中的許多方法都是用equals方法定義的,例如,containsKey(Object key)方法的規範說:」[太長,以至於不適合評論,但它是你給出的def]「這個規範不應該被解釋爲暗示用非空參數鍵調用Map.containsKey會導致key.equals(k)被調用用於任何鍵k。實現可以自由地實現優化,例如,通過首先比較兩個鍵的哈希碼,就可以避免相等的調用。「_ –
爲什麼在&神的綠色地球上,你會希望'compareTo'和'equals'等價地沒有響應? (並且要記住,任何有序集合都會使用相對比較來確定集合中實體的相對位置,所以'compareTo'是自然使用的,你需要使用'equals'的無序集合來「邏輯」 。) –