hashmap迭代器遍历(hashmap的迭代器遍历)

http://www.itjxue.com  2023-02-11 06:33  来源:未知  点击次数: 

java Map 怎么遍历

Object val = entry.getValue();}效率高,以后一定要使用此种方式!第二种:Map map = new HashMap();Iterator iter = map.keySet().iterator();while (iter.hasNext()) {Object key = iter.next();Object val = map.get(key);}效率低,以后尽量少使用!HashMap的遍历有两种常用的方法,那就是使用keyset及entryset来进行遍历,但两者的遍历速度是有差别的,下面请看实例:public class HashMapTest {public static void main(String[] args) ...{HashMap hashmap = new HashMap();for (int i = 0; i 1000; i ) ...{hashmap.put("" i, "thanks");}long bs = Calendar.getInstance().getTimeInMillis();Iterator iterator = hashmap.keySet().iterator();while (iterator.hasNext()) ...{System.out.print(hashmap.get(iterator.next()));}System.out.println();System.out.println(Calendar.getInstance().getTimeInMillis() - bs);listHashMap();}public static void listHashMap() ...{java.util.HashMap hashmap = new java.util.HashMap();for (int i = 0; i 1000; i ) ...{hashmap.put("" i, "thanks");}long bs = Calendar.getInstance().getTimeInMillis();java.util.Iterator it = hashmap.entrySet().iterator();while (it.hasNext()) ...{java.util.Map.Entry entry = (java.util.Map.Entry) it.next();// entry.getKey() 返回与此项对应的键// entry.getValue() 返回与此项对应的值System.out.println(Calendar.getInstance().getTimeInMillis() - bs);}}对于keySet其实是遍历了2次,一次是转为iterator,一次就从hashmap中取出key所对于的value。

JAVA中HashMap如何删除元素

HashMap删除元素根据其遍历方式一般有两种方法,实例演示如下:

一、采用foreach模式,适用于不需要修改HashMap内元素的遍历,只需要获取元素的键/值的情况。

1、遍历如下:

2、此时删除HashMap中的元素,Java很有可能会在运行时抛出异常。

运行上面的代码,Java抛出了 java.util.ConcurrentModificationException 的异常。并附有如下信息。

可以推测,由于在遍历HashMap的元素过程中删除了当前所在元素,下一个待访问的元素的指针也由此丢失了。

二、采用迭代器遍历,不仅适用于HashMap,对其它类型的容器同样适用。

1、采用这种方法的遍历,可以用下文提及的方式安全地对HashMap内的元素进行修改,并不会对后续的删除操作造成影响。

2、运行结果没有显示,表明HashMap中的元素被正确删除了,代码如下:

扩展资料:

HashMap的遍历中删除元素的特殊情况:

如果HashMap中的键值同样是一个HashMap,假设你需要处理的是 HashMapHashMapString, Integer, Double myHashMap 时,可能需要修改myHashMap中的一个项的键值HashMap中的某些元素,之后再将其删除。

这时,单单依靠迭代器的 remove() 方法是不足以将该元素删除的。

具体代码如下:

原因在于,迭代器遍历时,每一次调用 next() 函数,至多只能对容器修改一次。上面的代码则进行了两次修改:一次添加,一次删除。

HashMap和Hashtable的区别

HashMap和Hashtable的比较是Java面试中的常见问题,用来考验程序员是否能够正确使用集合类以及是否可以随机应变使用多种思路解决问题。HashMap的工作原理、ArrayList与Vector的比较以及这个问题是有关Java 集合框架的最经典的问题。Hashtable是个过时的集合类,存在于Java API中很久了。在Java 4中被重写了,实现了Map接口,所以自此以后也成了Java集合框架中的一部分。Hashtable和HashMap在Java面试中相当容易被问到,甚至成为了集合框架面试题中最常被考的问题,所以在参加任何Java面试之前,都不要忘了准备这一题。

这篇文章中,我们不仅将会看到HashMap和Hashtable的区别,还将看到它们之间的相似之处。

HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别。主要的区别有:线程安全性,同步(synchronization),以及速度。

由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。

HashMap不能保证随着时间的推移Map中的元素次序是不变的。

fail-fast机制在遍历一个集合时,当集合结构被修改,会抛出Concurrent Modification Exception。

fail-fast会在以下两种情况下抛出ConcurrentModificationException

集合被创建后,在遍历它的过程中修改了结构。

注意 remove()方法会让expectModcount和modcount 相等,所以是不会抛出这个异常。

当一个线程在遍历这个集合,而另一个线程对这个集合的结构进行了修改。

迭代器在遍历过程中是直接访问内部数据的,因此内部的数据在遍历的过程中无法被修改。为了保证不被修改,迭代器内部维护了一个标记 “mode” ,当集合结构改变(添加删除或者修改),标记"mode"会被修改,而迭代器每次的hasNext()和next()方法都会检查该"mode"是否被改变,当检测到被修改时,抛出Concurrent Modification Exception。

下面看看ArrayList迭代器部分的源码。

可以看到它的标记“mode”为 expectedModeCount。

fail-safe任何对集合结构的修改都会在一个复制的集合上进行修改,因此不会抛出ConcurrentModificationException。

fail-safe机制有两个问题

HashMap可以通过下面的语句进行同步:

Map m = Collections.synchronizeMap(hashMap);

Hashtable和HashMap有几个主要的不同:线程安全以及速度。仅在你需要完全的线程安全的时候使用Hashtable,而如果你使用Java 5或以上的话,请使用ConcurrentHashMap吧。

(责任编辑:IT教学网)

更多