java – 当重写等于总是返回False时,HashMap和Hashtable的不同行
发布时间:2020-12-15 04:32:16 所属栏目:Java 来源:网络整理
导读:参见英文答案 What issues should be considered when overriding equals and hashCode in Java?????????????????????????????????????11个 我很困惑,因为我认为HashMap和Hashtable在hashCode和equals方法时应该表现相同.在下面的示例中,我的键类已重写equal
参见英文答案 >
What issues should be considered when overriding equals and hashCode in Java?????????????????????????????????????11个
我很困惑,因为我认为HashMap和Hashtable在hashCode和equals方法时应该表现相同.在下面的示例中,我的键类已重写equals方法以始终返回false. 任何人都有任何想法可以解释这种行为上的差异,因为看起来两者的输出是不同的 值null 值null 价值1 价值2 import java.util.Hashtable; import java.util.HashMap; public class HashTest { public static void main(String[] args) { Hashtable ht = new Hashtable(); HashMap hm = new HashMap(); KeyClass k1 = new KeyClass("k1"); KeyClass k2 = new KeyClass("k2"); ht.put(k1,"Value 1"); ht.put(k2,"Value 2"); hm.put(k1,"Value 1"); hm.put(k2,"Value 2"); System.out.println("value " + ht.get(k1)); System.out.println("value " + ht.get(k2)); System.out.println("value " + hm.get(k1)); System.out.println("value " + hm.get(k2)); } } class KeyClass { String key; public KeyClass(String str) { key = str; } @Override public int hashCode() { return 2; } @Override public boolean equals(Object obj) { return false; } } 解决方法
发生这种情况是因为HashMap首先在等式检查中使用==:
public V get(Object key) { //... if (e.hash == hash && ((k = e.key) == key || key.equals(k))) return e.value; 因此,尽管equals()返回false,但同一个对象被视为相同的键. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |