HashMap遍历方式

来源:互联网 发布:淘宝预售如何合并付款 编辑:程序博客网 时间:2024/06/10 19:39


Java中HashMap有两种遍历方式:

第一种: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();  }


第二种:keySet方式效率低,只是需要key集合时可以使用

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


比较说明:

对于keySet其实遍历了两次:一次将HashMap的key集合转化到keySet中,一次在HashMap中取出key所对应的Value;

对于entrySet只是遍历了一次:将key和value作为一个实体entry放置与entrySet中,转化为iterator(迭代器);


java.util.ConcurrentModificationException异常:

java语言中,如果遍历map、collection、list等集合时(包括使用fail-fast Iterator对集合进行迭代操作),如果直接调用  

list.remove方法等修改数据源时,可能抛出java.util.ConcurrentModificationException异常!

原理如下:

       Iterator 是工作在一个独立的线程中,并且拥有一个mutex锁。 Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数

量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 Iterator 会马

上抛出 java.util.ConcurrentModificationException 异常。


       所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。但你可以使用 Iterator 本身的方法 remove() 来删除对象, Iterator.remove()

 方法会在删除当前迭代对象的同时维护索引的一致性。


       有意思的是如果你的 Collection / Map 对象实际只有一个元素的时候, ConcurrentModificationException 异常并不会被抛出。这也就是为什

么在 javadoc 里面指出: it would be wrong to write a program that depended on this exception for its correctness:

 ConcurrentModificationException should be used only to detect bugs.


Java中集合之元素顺序问题:


参考地址:http://www.cnblogs.com/taotaoblog/archive/2009/09/19/1569958.html

List遍历输出是有序的(依据add顺序输出),而HashMap的遍历输出没有顺序可言(误解:put添加顺序输出的理解是错误的),

数据结构不一样!



0 0
原创粉丝点击