关于对HashMap的实现原理

关于对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);
      }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值