private int threshold;
阈值,超出后需要重新调整容量
threshold = (int)Math.min(initialCapacity * loadFactor, MAX_ARRAY_SIZE + 1);
threshold=initialCapacity*loadFactor
初始容量*加载因子,加载因子默认为0.75,默认初始容量为11
超出阈值调整容量:两倍加一
int newCapacity = (oldCapacity << 1) + 1;
遍历
Map<String,String> hashmap = new Hashtable<>();
//遍历
Set<Map.Entry<String,String>> entrySet= hashmap.entrySet();
for (Map.Entry<String, String> entry : entrySet) {
entry.getKey();
entry.getKey();
}
put方法底层
public synchronized V put(K key, V value) {
//value不能为null
if (value == null) {
throw new NullPointerException();
}
// Hashtable用Entry<?,?>的数组来存数据,每个键值对都是一个Entry<?,?>,其中?表示任意类型
Entry<?,?> tab[] = table;
//计算key的hash值
int hash = key.hashCode();
//根据hash值计算index
int index = (hash & 0x7FFFFFFF) % tab.length;
@SuppressWarnings("unchecked")
//取得index位置的entry
Entry<K,V> entry = (Entry<K,V>)tab[index];
for(; entry != null ; entry = entry.next) {
//找到相同hash值的,更新value,并返回旧的value值
if ((entry.hash == hash) && entry.key.equals(key)) {
V old = entry.value;
entry.value = value;
return old;
}
}
//没找到相同hash值的,插入新的entry
addEntry(hash, key, value, index);
return null;
}
其中算index时hash & 0x7FFFFFFF目的是去除负数情况,详见
https://stackoverflow.com/questions/9380670/why-does-java-use-hash-0x7fffffff-tab-length-to-decide-the-index-of-a-key
结构图