本文共 1116 字,大约阅读时间需要 3 分钟。
HashTable是继承与Dictionary类,实现了Map接口,HashTable的主体还是Entry数组
HashTable的默认容量大小为11,负载因子为0.75HashTable的主要方法的源码实现逻辑,与HashMap中非常相似,有一点重大区别就是所有的操作都是通过synchronized锁保护实现的,只有获得了对应的锁,才能进行后续的读写操作
我们可以看到,HashTable的put方法使用synchronized修饰,也就是说当使用put方法时,必须要获取HashTable对象的锁
而且我们需要注意的一点是:当Value值为空时,HashTable直接抛出异常,说明HashTable不允许存储空值 接着通过key的hashcode获取数组的下标(在hashmap中,是通过扰动函数来先获取一个hash值,然后通过index=hash&(length-1)获取下标),接着会寻找该位置是否存在该值,如果存在,则用插入的值替换,返回该值 如果要插入的值在HashTable中不存在,则进行addEntry操作:首先判断数组中元素个数是否已经超过了负载容量,如果等于负载容量,则进行扩容操作,然后重新计算下标,在进行插入操作
HashTable的扩容是:扩大两倍加一,理由是:HashTable中的数组长度尽量为素数或者奇数,同时HashTable采用取模的方式来计算数组下标,这样减少了Hash碰撞,计算出来的数组下标更加均匀。但是这样效率会比HashMap利用位运算计算数组下标低
HashTable采用头插法的方式迁移数组,相比较HashMap的尾插法来说效率更高get()方法就是链表的查找问题
转载地址:http://thjmb.baihongyu.com/