所谓hash,实际上就是散列,音译为哈希,就是通过散列算法,将输入转换为固定长度的输出,详情点击传送门。
HashMap
1.创建hashMap时,可以指定创建长度和负载因子的map(其中负载因子,指的是已经使用存储空间与实际存储空间的比值,比值越大,节省空间,但是搜寻速度会变慢,过小,浪费空间,但是搜寻速度快,默认值 为0.75)
2.查看hashMap的put方法的源码实现
下图为确定hashCode在数组table中的索引位置,非常巧妙,当length总为2的次方时,假设 h=5,length=16, 那么 h & length - 1 将得到 5;如果 h=6,length=16, 那么 h & length - 1 将得到 6 ... 从而确定在数组中的位置
该源码体现了,hashMap中是允许存在空的键值,循环中,解决了当存在相同hashCode出现hash碰撞时的解决方法,并对存在键的旧值替换为新值,所以hashMap中不能存在重复键
小结:a.hashMap中是允许存在空的键值
b.hash碰撞时,通过实体链存储进行解决
c.hashMap中不能存在重复键
3.hashMap中对空键的处理putForNullKey方法
4.hashMap中的get方法
下图为get方法中调用的getEntry方法
5.hashMap对于resize表数组的处理
resize时必须进行位置的重新计算,不然不能找到准确的数据
与hashTable的区别
A.hashTable中缺省为synchronized,同步的,线程安全
B.由上可得出,hashMap可以存在空的键值,(判断hashMap中是否存在一个键只能使用containsKey,不能使用get),hashTable不允许存在空的键值
对于hashSet
hashSet底层的实现就是采用的hashMap,只是进行了一次封装,将数据存到key中,value存入的是PRESENT,就是一个Object
参考自:http://blog.csdn.net/bear_wr/article/details/52275874