您的位置:首页 > 其它

浅谈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

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: