浅谈HashMap与其两种遍历方法

虽然Map遍历用的比较少,一般是根据Key用来查询其Value,但是当我们不知道key的值的时候就需要对Map进行遍历进行对比。
HashMap是Map的一种实现,用的也比较多,Map是一个接口,存储Entry (key,value),HashMap里面可以存储null键和null值。
HashMap底层实现是数组和链表的数据结构。
数组中的元素存储的是同一个Hash值的链表(hash值相等的key放在同一个数组中)数组长度为2的n次幂有助于减少Hash值的碰撞,其根据key的hash值找到在数组中的位置,然后遍历链表中是否有该key,有的话进行覆盖value,否则添加到链表的表头。
数组的默认初始容量为16,当其超过容量的阈值默认为0.75时,会自动扩充为原来的2倍大小。

HashMap不是线程安全的。它用一个叫做fail-fast机制,不允许多个线程同时更改。
HashMap构造类
HashMap 包含如下几个构造器:
HashMap():构建一个初始容量为 16,负载因子为 0.75 的 HashMap。
HashMap(int initialCapacity):构建一个初始容量为 initialCapacity,负载因子为 0.75 的 HashMap。
HashMap(int initialCapacity, float loadFactor):以指定初始容量、指定的负载因子创建一个 HashMap。
HashMap的基础构造器HashMap(int initialCapacity, float loadFactor)带有两个参数,它们是初始容量initialCapacity和加载因子loadFactor。
initialCapacity:HashMap的最大容量,即为底层数组的长度。
loadFactor:负载因子loadFactor定义为:散列表的实际元素数目(n)/ 散列表的容量(m)。
负载因子衡量的是一个散列表的空间的使用程度,负载因子越大表示散列表的装填程度越高,反之愈小。对于使用链表法的散列表来说,查找一个元素的平均时间是O(1+a),因此如果负载因子越大,对空间的利用更充分,然而后果是查找效率的降低;如果负载因子太小,那么散列表的数据将过于稀疏,对空间造成严重浪费。
HashMap**遍历有两种方法**:
方法1:使用entrySet

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(); 
} 

方法2:使用keySet

Map map = new HashMap(); 
Iterator iter = map.keySet().iterator(); 
while (iter.hasNext()) { 
    Object key = iter.next(); 
    Object val = map.get(key); 
} 

两种方法都可以遍历整个map,但是方法1的速度上比方法2要快
因为方法1其实只要遍历一次,得到entry就可以获得key和value,而方法2其实要遍历两次,一次是转为iterator,一次就从hashmap中取出key所对应的value,所以其速度比较慢。

参考:
HashMap http://zhangshixi.iteye.com/blog/672697
HashMap查询时间: https://segmentfault.com/q/1010000000123183
HashMap和Hashtable的区别:http://www.importnew.com/7010.html

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值