public V put(K key, V value) { if (table == EMPTY_TABLE) { inflateTable(threshold); } if (key == null) return putForNullKey(value); int hash = hash(key); int i = indexFor(hash, table.length); for (Entry<K,V> e = table[i]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } } modCount++; addEntry(hash, key, value, i); return null; }
if (table == EMPTY_TABLE) { inflateTable(threshold); }
//定义一个变量保存key值,因为后面要根据这个key值计算得出hashcode int hash = hash(key); //定义变量,取得table的长度,用于计算hashcode int i = indexFor(hash, table.length); //循环遍历存放key和value的Entry的泛型集合 for (Entry<K,V> e = table[i]; e != null; e = e.next) { Object k; //如果在entry中存在和key相同的值(通过equals方法比较key值,比较hash值,比较key值是否已经存在) if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { //如果已经存在,将用现在key所对应的value值替换之前存放的value值,HashMap是以键值对存放的,一一对应 V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } }
modCount++; addEntry(hash, key, value, i); return null;
最终采用存放的形式还是使用数组进行存储,将索引值进行一次存储。
HashMap是线程不安全的,采用hash算法,利用key值计算具体的hashCode值进行
存储数据。如理解有偏差,请大家及时告知。