@Author:云都小生
h3{color:green;font-size:24}
p{font-size:22}
strong{color:red;font-size:24}
回顾HashMap
HashMap实现了Map接口,继承AbstractMap。
HashMap也是我们使用非常多的Collection,它是基于哈希表的Map接口的实现。存储的元素是以Key-value的形。
其实HashMap本质上是数组与指针(引用)的结合。
HashMap的实现
从树上月的文章中,我找到了HashMap背后的实现原理。
public V put(K key, V value) {
//当key为null,调用putForNullKey方法,保存null与table第一个位置中,这是HashMap允许为null的原因
if (key == null)
return putForNullKey(value);
//计算key的hash值
int hash = hash(key.hashCode()); ------(1)
//计算key hash 值在 table 数组中的位置
int i = indexFor(hash, table.length); ------(2)
//从i出开始迭代 e,找到 key 保存的位置
for (Entry<K, V> e = table[i]; e != null; e = e.next) {
Object k;
//判断该条链上是否有hash值相同的(key相同)
//若存在相同,则直接覆盖value,返回旧value
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value; //旧值 = 新值
e.value = value;
e.recordAccess(this);
return oldValue; //返回旧值
}
}
//修改次数增加1
modCount++;
//将key、value添加至i位置处
addEntry(hash, key, value, i);
return null;
}
如果Key为null,则直接调用putForNullKey方法,HashMap允许null键和null值。
若不为null则计算Key的hash值,搜索在数组中的索引位置。如果有相同的Key就直接覆盖value值,这也就说明了Map中不能存放相同的Key。
使用HashMap
遍历HashMap的遍历方式跟ArrayList、HashSet不一样。
import java.util.*;
public class SetDemo {
public static void main(String[] args) {
HashMap map = new HashMap();
map.put("1", 123);
map.put("2", 234);
Iterator iter = map.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
Object key = entry.getKey();
Object val = entry.getValue();
System.out.println("Key:" + key + " value:" + val);
}
}
}
2017/10/20 21:10:32 @Author:云都小生