privatevoidgrow(int minCapacity){//已经加入到数组中的元素的个数+1,第一次添加元素是minCapacity=10// overflow-conscious code//获取当前数组长度,第一次长度=0int oldCapacity = elementData.length;//扩容获取新的容量,扩容的大小就是当前数组长度的1.5倍//第一次添加元素的长度=0,因此newCapacity=0*1.5=0int newCapacity = oldCapacity +(oldCapacity >>1);//如果扩容后的容量还是没有比旧容量大,则证明是第一次添加元素,因此默认将数组扩容10if(newCapacity - minCapacity <0)
newCapacity = minCapacity;////如果扩容后的容量比最大容量大,则需进一步处理if(newCapacity - MAX_ARRAY_SIZE >0)
newCapacity =hugeCapacity(minCapacity);// minCapacity is usually close to size, so this is a win://为保证数组扩容后不丢失数据,使用copyOf方法在以添加的数据后面追加容量
elementData =Arrays.copyOf(elementData, newCapacity);}
按照 int newCapacity = (oldCapacity << 1) + 1; 的大小扩容.
hashtable的键和值都不能为空,否则会抛出空指针异常
hashtable的使用方法基本和hashmap一样
hashtable是线程安全的
publicHashtable(){this(11,0.75f);//初始化容量,默认11}
publicsynchronizedVput(K key,V value){// Make sure the value is not nullif(value ==null){//value值不能为空thrownewNullPointerException();}// Makes sure the key is not already in the hashtable.Entry<?,?> tab[]= table;//辅助变量int hash = key.hashCode();//获得key的hash值int index =(hash &0x7FFFFFFF)% tab.length;//计算索引@SuppressWarnings("unchecked")Entry<K,V> entry =(Entry<K,V>)tab[index];for(; entry !=null; entry = entry.next){if((entry.hash == hash)&& entry.key.equals(key)){//判断是否有重复的key值V old = entry.value;//更新当前key对应的value
entry.value = value;return old;}}addEntry(hash, key, value, index);//如果当前的key唯一,则添加到entry数组中returnnull;}
privatevoidaddEntry(int hash,K key,V value,int index){
modCount++;Entry<?,?> tab[]= table;//辅助变量if(count >= threshold){//如果当前的数量已经到达threshold临界值// Rehash the table if the threshold is exceededrehash();//扩容
tab = table;//复制数组
hash = key.hashCode();//获取hashcode
index =(hash &0x7FFFFFFF)% tab.length;//计算索引}// Creates the new entry.@SuppressWarnings("unchecked")Entry<K,V> e =(Entry<K,V>) tab[index];
tab[index]=newEntry<>(hash, key, value, e);//建立新结点并插入
count++;}