重写hashcode的时候都是按照推荐方法,从来没有仔细考虑为什么不可以直接返回一个常数
结论
hashmap
是通过hashcode
来确定来确定槽位的,如果hashcode
相同,则认为槽位冲突,需要使用链地址法解决冲突,降低了hashmap
的效率。
源码
hashmap
的put
源码
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}
而其中hash(key)
的源码
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
如果key
的hashCode
返回0,则0>>>16
依然为0
,而0^0
还是0
,那么除第一个object
外其他所有的object
存入HashMap
时都会冲突,HashMap
的效率就降低为O(log(n))
了。
网友评论