浅谈HashMap与其两种遍历方法
2016-04-23 16:24
435 查看
虽然Map遍历用的比较少,一般是根据Key用来查询其Value,但是当我们不知道key的值的时候就需要对Map进行遍历进行对比。
HashMap是Map的一种实现,用的也比较多,Map是一个接口,存储Entry (key,value)
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
方法2:使用keySet
两种方法都可以遍历整个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是Map的一种实现,用的也比较多,Map是一个接口,存储Entry (key,value)
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
相关文章推荐
- Word中向左缩进
- mac用brew安装ruby
- 福建一出租房内母亲病亡 3岁女童靠剩食坚持2天
- iOS UITableViewCell 重用及 性能优化
- css3折叠效果
- [Java] 实现一个基于命令行的用户管理
- 2016年4月13日作业
- ASP漏洞+SQL注入的入侵方法
- .+filename的作用
- LeetCode 68. Text Justification
- FIFO页面置换算法实现(百度笔试题1)
- android AIDL(草稿)
- ASP漏洞+SQL注入的入侵方法
- hadoop学习序曲之linux基础篇--shell编程入门
- 让键盘消失的方法
- Spark机器学习(三) Labeled point-- Data Types
- 只开80端口主机的入侵思路
- return 、 return false、return true区别
- Android 继承ViewGroup必须重写onMeasure方法和onLayout方法
- Python 易犯错误