当某个类的对象作为HashMap的key时,必须同时覆写equals()和hashCode方法
更加一般意义的是:只要某各类结合基于散列的集合一起使用,那么就必须同时覆写equals()和HashCode方法
否则就会被Object类 的hashCode方法所干扰!
采用e.hash == hash判断hashCode()是出于效率考虑,短路与!
HashMap的get()方法!
public V get(Object key) {
if (key == null)
return getForNullKey();
int hash = hash(key.hashCode());
for (Entry<K,V> e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
return e.value;
}
return null;
}
在thinking in java中hashmap中说,如果key是自定义的类,那么必须得重载equals()和hashcode()两个方法
一般来说,如果你要把一个类的对象放入容器中,那么通常要为其重写equals()方法,让他们比较地址值而不是内容值。特别地,如果要把你的类的对象放入散列中,那么还要重写hashCode()方法;要放到有序容器中,还要重写compareTo()方法。
在java的集合中,判断两个对象是否相等的规则是:
首先,判断两个对象的hashCode是否相等
如果不相等,认为两个对象也不相等
如果相等,则判断两个对象用equals运算是否相等
如果不相等,认为两个对象也不相等
如果相等,认为两个对象相等
我们在equals方法中需要向下转型,效率很低,所以先判断hashCode方法可以提高效率