测试代码:

  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并未进行更改 

 

 

  1. public V put(K key, V value) {  
  2.         // 如果key为null使用putForNullKey来获取  
  3.         if (key == null)  
  4.             return putForNullKey(value);  
  5.         // 使用hash函数预处理hashCode  
  6.         int hash = hash(key.hashCode());  
  7.         // 获取对应的索引  
  8.         int i = indexFor(hash, table.length);  
  9.         // 得到对应的hash值的桶,如果这个桶不是,就通过next获取下一个桶  
  10.         for (Entry<K,V> e = table[i]; e != null; e = e.next) {  
  11.             Object k;  
  12.             // 如果hash相同并且key相同  
  13.             if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {  
  14.                 // 获取当前的value  
  15.                 V oldValue = e.value;  
  16.                 // 将要存储的value存进去  
  17.                 e.value = value;  
  18.                 e.recordAccess(this);  
  19.                 // 返回旧的value  
  20.                 return oldValue;  
  21.             }  
  22.         }  
  23.   
  24.         modCount++;  
  25.         addEntry(hash, key, value, i);  
  26.         return null;  
  27.     } 
  1.   // 通过key获取一个value  
  2.     final Entry<K,V> getEntry(Object key) {  
  3.         // 如果key为null,则hash为0,否则用hash函数预处理  
  4.         int hash = (key == null) ? 0 : hash(key.hashCode());  
  5.         // 得到对应的hash值的桶,如果这个桶不是,就通过next获取下一个桶  
  6.         for (Entry<K,V> e = table[indexFor(hash, table.length)];  
  7.              e != null;  
  8.              e = e.next) {  
  9.             Object k;  
  10.             // 如果hash值相等,并且key相等则证明这个桶里的东西是我们想要的  
  11.             if (e.hash == hash &&  
  12.                 ((k = e.key) == key || (key != null && key.equals(k))))  
  13.                 return e;  
  14.         }  
  15.         // 所有桶都找遍了,没找到想要的,所以返回null  
  16.         return null;  
  17.     }