一、实例化一个HashMap对象
public void testHashMap() {
Map map = new HashMap();
map.put("hahaha", 1);
}
二、利用put方法将保存数据
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;
}
这个是源码中具体的put方法,接下来一点点的解析
a.首先给分配空间,默认为10
if (table == EMPTY_TABLE) {
inflateTable(threshold);
}
b.判断key值是否为空,如果为空,返回一个空值null,因为HashMap中可以存放null值
if (key == null)
return putForNullKey(value);
c.计算HashCode值
//定义一个变量保存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;
}
}
d.改变HashMap被修改的次数
e.存放HashMap被修改的次数
f.存放数据
modCount++;
addEntry(hash, key, value, i);
return null;
存放数据形式:
void createEntry(int hash, K key, V value, int bucketIndex) {
Entry<K,V> e = table[bucketIndex];
table[bucketIndex] = new Entry<>(hash, key, value, e);
size++;
总结:
HashMap是线程不安全的,采用hash算法,利用key值计算具体的hashCode值进行
存储数据。如理解有偏差,请大家及时告知。