测试代码:
int initialCapacity = 16;
float loadFactor = 0.75f;
HashMap<String,String> hashMap = new HashMap<>(initialCapacity,loadFactor);
System.out.println(hashMap.put("1","v1"));
System.out.println(hashMap.put("1","v2"));
Iterator<String> it = hashMap.keySet().iterator();
while (it.hasNext()){
System.out.println(hashMap.get(it.next()));
}
HashMap构造方法中两个参数initialCapacity(初始化容器大小、系统默认初始容量,必须是2的n次幂,这是出于优化考虑的
),loadFactor(哈希表的负载因子)。
Entry[] table 用于存储的表,长度可以调整,且必须是2的n次幂
阈值 threshold=容器大小*负载因子、用来判断是否需要扩充当前容器大小。
modCount 用于确保使用迭代器的时候,HashMap并未进行更改
- public V put(K key, V value) {
- // 如果key为null使用putForNullKey来获取
- if (key == null)
- return putForNullKey(value);
- // 使用hash函数预处理hashCode
- int hash = hash(key.hashCode());
- // 获取对应的索引
- int i = indexFor(hash, table.length);
- // 得到对应的hash值的桶,如果这个桶不是,就通过next获取下一个桶
- for (Entry<K,V> e = table[i]; e != null; e = e.next) {
- Object k;
- // 如果hash相同并且key相同
- if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
- // 获取当前的value
- V oldValue = e.value;
- // 将要存储的value存进去
- e.value = value;
- e.recordAccess(this);
- // 返回旧的value
- return oldValue;
- }
- }
- modCount++;
- addEntry(hash, key, value, i);
- return null;
- }
- // 通过key获取一个value
- final Entry<K,V> getEntry(Object key) {
- // 如果key为null,则hash为0,否则用hash函数预处理
- int hash = (key == null) ? 0 : hash(key.hashCode());
- // 得到对应的hash值的桶,如果这个桶不是,就通过next获取下一个桶
- for (Entry<K,V> e = table[indexFor(hash, table.length)];
- e != null;
- e = e.next) {
- Object k;
- // 如果hash值相等,并且key相等则证明这个桶里的东西是我们想要的
- if (e.hash == hash &&
- ((k = e.key) == key || (key != null && key.equals(k))))
- return e;
- }
- // 所有桶都找遍了,没找到想要的,所以返回null
- return null;
- }