`
小网客
  • 浏览: 1248866 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

HashMap的2中遍历方式比较

 
阅读更多

首先我们准备数据,准备一个map

		Map<String, String> map = new HashMap<String, String>();
		for (int i = 0; i < 10; i++) {
			map.put(i + "", "value" + i);
		}

然后我们采用传说中的key遍历:

步骤:先弄成key set,然后遍历key set 通过key从map中获取value

		Iterator<String> iterator = map.keySet().iterator();
		while (iterator.hasNext()) {
			String key = iterator.next();
			String val = map.get(key);
			System.out.println(key + "->" + val);
		}
		System.out.println("*********************");

然后我们在采用entrySet的方式遍历下:

步骤:先弄成entrySet 然后遍历他,获取key和value

		Set<Entry<String, String>> set = map.entrySet();
		Iterator<Entry<String, String>> s = set.iterator();
		while (s.hasNext()) {
			Entry<String, String> en = s.next();
			String key = en.getKey();
			String val = en.getValue();
			System.out.println(key + "->" + val);
		}

孰优孰劣?

看JDK源码,对比两种访问方式:

首先看KeySet访问方式:

    public Set<K> keySet() {
	if (keySet == null) {
	    keySet = new AbstractSet<K>() {
		public Iterator<K> iterator() {
		    return new Iterator<K>() {
			private Iterator<Entry<K,V>> i = entrySet().iterator();

			public boolean hasNext() {
			    return i.hasNext();
			}

			public K next() {
			    return i.next().getKey();
			}

			public void remove() {
			    i.remove();
			}
                    };
		}

		public int size() {
		    return AbstractMap.this.size();
		}

		public boolean contains(Object k) {
		    return AbstractMap.this.containsKey(k);
		}
	    };
	}
	return keySet;
    }

也就是调用entrySet()从entryset中获取key,也就是说是在entry set的基础上来做的,貌似多次一举

结论:

通过上述代码我们就知道,采用entrySet方式要优于keySet,因为keySet首先要访问entrySet来组建一个keySet,重复工作不言而喻
 

 

9
6
分享到:
评论
14 楼 小网客 2013-11-05  
5开始就有for each风格了,不过我还是偏向iterator,貌似对我来说可读性好 哈
smallplum 写道
tufly 写道
太讨厌 iterator了,JDK5应该都一般装的吧。for each的写法中,keySet应该是只简单的,我只会写
for(Object o:map.keySet()){
System.out.println(o);
System.out.println(map.get(o));
}



可以这样写:
        for(Map.Entry entry : map.entrySet()){
            System.out.println(entry.getKey());
            System.out.println(entry.getValue());
        }

13 楼 smallplum 2013-11-05  
tufly 写道
太讨厌 iterator了,JDK5应该都一般装的吧。for each的写法中,keySet应该是只简单的,我只会写
for(Object o:map.keySet()){
System.out.println(o);
System.out.println(map.get(o));
}



可以这样写:
        for(Map.Entry entry : map.entrySet()){
            System.out.println(entry.getKey());
            System.out.println(entry.getValue());
        }
12 楼 zy19982004 2012-11-21  
ansjsun 写道
zy19982004 写道
keyset时间复杂度O(n*n)
entryset时间复杂度O(n)

keyset时间复杂度O(n*n)????这个是怎么计算出来的???
hash定位是o(1)吧

是我搞错了
11 楼 请输入用户名 2012-11-21  
楼主说的不妥,keySet要慢一丁点主要是会多一次hashCode计算和查找的冲突解决过程,像你说的这里不足为虑。而且当key是字符串的时候,keySet和entrySet花费时间也是相当的,只有hash比较耗时或者命中率很差的情况下,entrySet才会明细优于keySet.
10 楼 zhukewen_java 2012-11-20  
想了很久,为什么标题是说2种而不是说两种?
9 楼 mfkvfn 2012-11-20  
mfkvfn 写道
有什么好争的,运行一遍不就行了。插入10000条记录,然后用两种方式试一下,打印一下用时是多少。

keySet应该要快一丁点。

说错了,keySet要慢一丁点。会多一次hashCode计算和查找的冲突解决过程。
8 楼 mfkvfn 2012-11-20  
有什么好争的,运行一遍不就行了。插入10000条记录,然后用两种方式试一下,打印一下用时是多少。

keySet应该要快一丁点。
7 楼 小网客 2012-11-20  
貌似是不一样 你瞅瞅 你的KeyIterator 的源码是啥 看看他是否通过entrySet()来遍历的?
RyanLu 写道
楼主。。。你这是java.util.HashMap的源代码吗?我的JDK 6版本里面的跟你的不一样。。。
public Set<K> keySet() {
        Set<K> ks = keySet;
        return (ks != null ? ks : (keySet = new KeySet()));
    }

    private final class KeySet extends AbstractSet<K> {
        public Iterator<K> iterator() {
            return newKeyIterator();
        }
        public int size() {
            return size;
        }
        public boolean contains(Object o) {
            return containsKey(o);
        }
        public boolean remove(Object o) {
            return HashMap.this.removeEntryForKey(o) != null;
        }
        public void clear() {
            HashMap.this.clear();
        }
    }

HashMap的几种遍历方式都通过内部类实现相应的iterator,这些iterator都是继承内部类Hash Iterator的。效率上来说应该是一样的。
6 楼 RyanLu 2012-11-20  
楼主。。。你这是java.util.HashMap的源代码吗?我的JDK 6版本里面的跟你的不一样。。。
public Set<K> keySet() {
        Set<K> ks = keySet;
        return (ks != null ? ks : (keySet = new KeySet()));
    }

    private final class KeySet extends AbstractSet<K> {
        public Iterator<K> iterator() {
            return newKeyIterator();
        }
        public int size() {
            return size;
        }
        public boolean contains(Object o) {
            return containsKey(o);
        }
        public boolean remove(Object o) {
            return HashMap.this.removeEntryForKey(o) != null;
        }
        public void clear() {
            HashMap.this.clear();
        }
    }

HashMap的几种遍历方式都通过内部类实现相应的iterator,这些iterator都是继承内部类Hash Iterator的。效率上来说应该是一样的。
5 楼 ansjsun 2012-11-20  
zy19982004 写道
keyset时间复杂度O(n*n)
entryset时间复杂度O(n)

keyset时间复杂度O(n*n)????这个是怎么计算出来的???
hash定位是o(1)吧
4 楼 zy19982004 2012-11-19  
keyset时间复杂度O(n*n)
entryset时间复杂度O(n)
3 楼 九路车没站牌 2012-11-19  
引用
[img][/img][flash=200,200][/flash]
2 楼 小网客 2012-11-19  
tufly 写道
太讨厌 iterator了,JDK5应该都一般装的吧。for each的写法中,keySet应该是只简单的,我只会写
for(Object o:map.keySet()){
System.out.println(o);
System.out.println(map.get(o));
}

key set方法遍历效率不高
1 楼 tufly 2012-11-19  
太讨厌 iterator了,JDK5应该都一般装的吧。for each的写法中,keySet应该是只简单的,我只会写
for(Object o:map.keySet()){
System.out.println(o);
System.out.println(map.get(o));
}

相关推荐

    HashMap和List遍历方法及如何遍历删除元素总结

    要解决HashMap遍历删除元素的问题,可以使用Iterator来遍历HashMap,并使用Iterator的remove方法来删除元素。这样可以避免ConcurrentModificationException异常。 小结 在遍历和删除HashMap和List的元素时,需要...

    Java HashMap 如何正确遍历并删除元素的方法小结

    这段代码将抛出 `java.util.ConcurrentModificationException` 异常,因为在遍历 HashMap 的元素过程中删除了当前所在元素,下一个待访问的元素的指针也由此丢失了。 2. 正确的删除方法 正确的删除方法是使用迭代...

    基于HashMap遍历和使用方法(详解)

    HashMap遍历和使用方法详解 HashMap是Java中一种常用的数据结构,用于存储键值对的集合。它实现了Map接口,是基于哈希表结构的,可以快速地存储和检索数据。本文将详细介绍HashMap的遍历和使用方法,并比较HashMap...

    Java HashMap的三种遍历方法及优缺点含示例

    这种方式比较适合只需要使用键的场景。 **优点**:如果只需要键,这种方法可以避免不必要的值拷贝,简单直接。 **缺点**:需要额外的get()操作来获取值,增加了遍历的复杂性。 ```java for (String key : hashMap...

    HashMap遍历

    ### HashMap遍历详解 在Java编程中,`HashMap`是一种常用的数据结构,它实现了`Map`接口,提供了基于哈希表的存储方式,允许我们快速地查找、插入和删除键值对。对于`HashMap`的遍历,是进行数据处理和分析时不可或...

    Java HashMap三种循环遍历方式及其性能对比实例分析

    这种遍历方式可以直接获取HashMap中的键值对,并且可以快速地遍历整个HashMap。 二、显示调用map.entrySet()的集合迭代器遍历方式 显示调用map.entrySet()的集合迭代器是另一种遍历方式,其实现代码如下: ```...

    map遍历的四种方式及性能比较

    ### Java中遍历Map的四种方式及性能比较 在Java编程中,`Map`是一种非常重要的数据结构,用于存储键值对。对于`Map`的遍历,不同的遍历方式有着不同的性能表现以及适用场景。本文将详细介绍四种常见的遍历`Map`的...

    java哈希遍历_哈希遍历_

    在Java编程中,哈希遍历(Hash Traversal)通常是指对哈希表或映射数据结构(如HashMap)中的键值对进行访问的过程。哈希表是一种高效的数据存储方式,它通过计算对象的哈希码来快速定位数据,使得查找、插入和删除...

    Java 实例 - HashMap遍历源代码-详细教程.zip

    5. **HashMap遍历注意事项**: - 遍历HashMap时修改HashMap(添加、删除元素)可能会导致`ConcurrentModificationException`,因为迭代器无法检测到这种并发修改。 - 使用`keySet()`遍历并删除元素是安全的,但...

    Java5种遍历HashMap数据的写法

    然而,在实际开发中,我们经常需要遍历HashMap中的数据以实现某些功能。下面将介绍五种遍历HashMap数据的写法,以满足不同场景下的需求。 通过EntrySet的迭代器遍历 在Java中,我们可以使用EntrySet的迭代器来遍历...

    java遍历HashMap简单的方法

    HashMap遍历的常用方法主要有三种:迭代器(Iterator)遍历、键集(KeySet)遍历以及 Entry 集(entrySet)遍历。下面将逐一介绍这些方法。 1. 迭代器遍历: HashMap提供了迭代器接口(Iterator),可以通过调用`...

    java中Map集合的常用遍历方法及HashMap的应用实例

    2、遍历Map.keySet():它是Map中key值的集合,我们可以通过遍历这个集合来 读取Map中的元素; 3、遍历Map.values():它是Map中value的集合,我们可以直接通过这个集合遍历 Map中的值,却不能读取key。

    hashMap和hashTable的区别

    - **HashMap**:在 Java 8 中引入了并行化能力,通过 `ConcurrentHashMap` 的实现方式,提高了多线程环境下的性能。 - **HashTable**:由于其同步策略,不适用于高并发场景。 9. **迭代器**: - **HashMap**:...

    struts2中的map遍历

    在Struts2中,Map遍历是一个常见的功能,它允许开发者动态地展示或操作存储在Map中的数据。这个功能在处理表单提交、传递参数或者在视图层展示数据时尤为有用。 首先,让我们理解Map遍历的基本概念。Map是一种键值...

    HashMap总结

    2. 使用 foreach 遍历:使用 foreach 语句遍历 HashMap 中的元素。 HashMap 的常用方法 1. clear():清空 HashMap 中的所有元素。 2. isEmpty():检查 HashMap 是否为空。 3. size():取得 HashMap 中的元素数量。...

    FLEX HashMap遍历并取到需要的值

    标题中提到的"FLEX HashMap遍历并取到需要的值",是指在编程中如何使用Java语言的HashMap集合类型进行遍历,并且从中取得符合特定条件的数据值。HashMap是一种基于哈希表的Map接口实现,它允许我们存储键值对,其中...

    1.HashSet和HashMap遍历.md

    自己写的例子,关于HashSet遍历和HashMap遍历的. 感谢大家参考

    怎样遍历一个HashMap?

    可以通过2种方法遍历HashMap &lt;br&gt;Map map = new HashMap(); &lt;br&gt;for (Iterator iter = map.entrySet().iterator(); iter.hasNext();) { &lt;br&gt; Map.Entry entry = (Map.Entry) iter.next(); &lt;br&gt; Object ...

    map遍历的四种方法

    本文将详细介绍四种不同的遍历`Map`的方式,并通过具体的代码示例来解释每种方法的特点及适用场景。 #### 一、通过`Map.keySet()`遍历键和值 这种方法首先获取`Map`的所有键集合(`keySet`),然后通过迭代器或者...

    使用多种方式实现遍历HashMap的方法

    2. **方式二:使用Values方法** Values方法返回HashMap中所有值的Collection视图。与KeySet类似,由于Collection接口实现了Iterable,我们同样可以使用for-each循环来遍历并打印每个值。这种方式只能获取值,不能...

Global site tag (gtag.js) - Google Analytics