在使用
hashmap
时发现很奇怪的情况,在
put
时,不同的
key
值也会出现覆盖的现象,从网上查了一些资料,整理如下:
首先来看
存储过程(
Hashmap
和
Hashtable
的存储过程估计相同):
index = (o.hashCode() & 0x7FFFFFFF)%hs.length;
这个值对象就会直接放在
Hashtable
的第
index
位置,如果是查询,经过同样的算法,
Hashtable
可以直接通过
key
得到
index
,从第
index
取得这个值对象。(先将作为
key
的对象的
HashCode
和
0x7FFFFFFF
做与操作,是因为一个对象的
HashCode
可以为负数,这样操作后可以保证它为一个正整数)。
Hashmap,Hashtable
产生相同
index
的原因:
1.Object
提供的
hashCode()
的缺省实施通过将对象的内存地址对映于一个整数值来生成。
由于在某些架构上,地址空间大于
int
值的范围,两个不同的对象有相同的
hashCode()
是可能的。
2.
虽然不同对象有不同的
hashcode
,但不同的
hashCode
经过与长度的取余,可能产生相同的
index
。
产生相同的index肯定就会覆盖以前的内容,而两个对象有相同hashcode的可能性很大。
疑问:1.hashmap是准许key或value为null的,所以不存在的key值和value值是null的使用get()方法时的返回值是相同的,即都是null。hashmap要用containsKey()方法判断某个键的存在,但是如果key是null,如何得到它的hashcode呢?
2.java中每个对象都有hashcode和equals()方法:
- 如果x.equals(y)返回“true”,那么x和y的hashCode()相等。
- 如果x.equals(y)返回“false”,那么x和y的hashCode()可能相同,也可能不同。就是说用HashCode判断两个对象是否相等不安全,HashCode和0x7FFFFFFF做与操作后重复更大。如何减少这种重复。