关于对HashMap的理解
近几天返回去看java的知识,发现理解的太表面了,所以今天对于HashMap做一下总结:
一、关于Hash Map的数据结构:
有的人可能会说hashmap的数据结构是数组和链表,也有的人说是数据、链表和红黑树。在我查了一些资料发现这两种说法都是正确的。
在java1.7里面使用的时候数组+链表的数据结构,在java1.8里使用的是数组+链表+红黑树。
随之而来的问题就是为什么在1.8中要进行修改呢?是因为Java需要晚上他的性能,修复他的漏洞。但是到底提升了多少的效率呢?
1、在1.7中:
第一步put过程:先根据key的hashCode重新计算hash值,根据hash值得到这个元素在数组中的位置(即下标), 如果数组该位置上已经存放有其他元素了,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放在链尾。如果数组该位置上没有元素,就直接将该元素放到此数组中的该位置上。
第二步get过程:计算key对应数组的index,找到数组的头结头,从头结点逐个向下遍历,知道可以的hash值和节点的hash值碰撞相等,才会取出value值。
2、在1.8中:
HashMap处理“碰撞”增加了红黑树这种数据结构,当碰撞结点较少时,采用链表存储,当较大时(>8个),采用红黑树(特点是查询时间是O(logn))存储(有一个阀值控制,大于阀值8个),将链表存储转换成红黑树存储。
HashMap中的两种遍历方式:
第一种:
这种效率高,可以经常使用:
Map map = new HashMap();
Iterator iter = map.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
Object key = entry.getKey();
Object val = entry.getValue();
}
第二种:
Map map = new HashMap();
Iterator iter = map.keySet().iterator();
while (iter.hasNext()) {
Object key = iter.next();
Object val = map.get(key);
}