精华内容
下载资源
问答
  • java对HashMap遍历方法

    2019-11-13 21:01:04
    HashMap遍历 在Java中有多种遍历HashMap的方法。让我们回顾一下最常见的方法和它们各自的优缺点。由于所有的Map都实现了Map接口,所以接下来方法适用于所有Map(如:HaspMap,TreeMap,LinkedMap,HashTable,etc) ...

    Java 必知必会 第 52 篇

    iterate through a hashmap

    HashMap遍历

    在Java中有多种遍历HashMap的方法。让我们回顾一下最常见的方法和它们各自的优缺点。由于所有的Map都实现了Map接口,所以接下来方法适用于所有Map(如:HaspMap,TreeMap,LinkedMap,HashTable,etc)

    方法#1 使用For-Each迭代entries

    这是最常见的方法,并在大多数情况下更可取的。当你在循环中需要使用Map的键和值时,就可以使用这个方法

    Map<Integer, Integer> map = new HashMap<Integer, Integer>();
    for(Map.Entry<Integer, Integer> entry : map.entrySet()){
    	System.out.println("key = " + entry.getKey() + ", value = " + entry.getValue())
    }
    

    注意:For-Each循环是Java5新引入的,所以只能在Java5以上的版本中使用。如果你遍历的map是null的话,For-Each循环会抛出NullPointerException异常,所以在遍历之前你应该判断是否为空引用。

    方法#2 使用For-Each迭代keys和values

    如果你只需要用到map的keys或values时,你可以遍历KeySet或者values代替entrySet

    Map<Integer, Integer> map = new HashMap<Integer, Integer>();
    
    //iterating over keys only
    for (Integer key : map.keySet()) {
    	System.out.println("Key = " + key);
    }
    
    //iterating over values only
    for (Integer value : map.values()) {
    	System.out.println("Value = " + value);
    }
    

    这个方法比entrySet迭代具有轻微的性能优势(大约快10%)并且代码更简洁

    方法#3 使用Iterator迭代

    使用泛型

    Map<Integer, Integer> map = new HashMap<Integer, Integer>();
    Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator();
    while (entries.hasNext()) {
    	Map.Entry<Integer, Integer> entry = entries.next();
    	System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
    }
    

    不使用泛型

    Map map = new HashMap();
    Iterator entries = map.entrySet().iterator();
    while (entries.hasNext()) {
    	Map.Entry entry = (Map.Entry) entries.next();
    	Integer key = (Integer)entry.getKey();
    	Integer value = (Integer)entry.getValue();
    	System.out.println("Key = " + key + ", Value = " + value);
    }
    

    你可以使用同样的技术迭代keyset或者values

    这个似乎有点多余但它具有自己的优势。首先,它是遍历老java版本map的唯一方法。另外一个重要的特性是可以让你在迭代的时候从map中删除entries的(通过调用iterator.remover())唯一方法.如果你试图在For-Each迭代的时候删除entries,你将会得到unpredictable resultes 异常。

    从性能方法看,这个方法等价于使用For-Each迭代

    方法#4 迭代keys并搜索values(低效的)

    Map<Integer, Integer> map = new HashMap<Integer, Integer>();
    for (Integer key : map.keySet()) {
    	Integer value = map.get(key);
    	System.out.println("Key = " + key + ", Value = " + value);
    }
    

    这个方法看上去比方法#1更简洁,但是实际上它更慢更低效,通过key得到value值更耗时(这个方法在所有实现map接口的map中比方法#1慢20%-200%)。如果你安装了FindBugs,它将检测并警告你这是一个低效的迭代。这个方法应该避免

    总结

    如果你只需要使用key或者value使用方法#2,如果你坚持使用java的老版本(java 5 以前的版本)或者打算在迭代的时候移除entries,使用方法#3。其他情况请使用#1方法。避免使用#4方法。

    展开全文
  • HashMap遍历

    2017-06-05 14:02:10
    方法#1 使用For-Each迭代entries 这是最常见的方法,并在大多数情况下更可取的。...Map map = new HashMap(); for(Map.Entry entry : map.entrySet()){ System.out.println("key = " + entry.getKey() + ", val

    方法#1 使用For-Each迭代entries

    这是最常见的方法,并在大多数情况下更可取的。当你在循环中需要使用Map的键和值时,就可以使用这个方法

    Map<Integer, Integer> map = new HashMap<Integer, Integer>();
    for(Map.Entry<Integer, Integer> entry : map.entrySet()){
    	System.out.println("key = " + entry.getKey() + ", value = " + entry.getValue())
    }
    

    注意:For-Each循环是Java5新引入的,所以只能在Java5以上的版本中使用。如果你遍历的map是null的话,For-Each循环会抛出NullPointerException异常,所以在遍历之前你应该判断是否为空引用。

    方法#2 使用For-Each迭代keys和values

    如果你只需要用到map的keys或values时,你可以遍历KeySet或者values代替entrySet

    Map<Integer, Integer> map = new HashMap<Integer, Integer>();
    
    //iterating over keys only
    for (Integer key : map.keySet()) {
    	System.out.println("Key = " + key);
    }
    
    //iterating over values only
    for (Integer value : map.values()) {
    	System.out.println("Value = " + value);
    }
    

    这个方法比entrySet迭代具有轻微的性能优势(大约快10%)并且代码更简洁

    方法#3 使用Iterator迭代

    使用泛型

    Map<Integer, Integer> map = new HashMap<Integer, Integer>();
    Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator();
    while (entries.hasNext()) {
    	Map.Entry<Integer, Integer> entry = entries.next();
    	System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
    }
    

    不使用泛型

    Map map = new HashMap();
    Iterator entries = map.entrySet().iterator();
    while (entries.hasNext()) {
    	Map.Entry entry = (Map.Entry) entries.next();
    	Integer key = (Integer)entry.getKey();
    	Integer value = (Integer)entry.getValue();
    	System.out.println("Key = " + key + ", Value = " + value);
    }
    

    你可以使用同样的技术迭代keyset或者values

    这个似乎有点多余但它具有自己的优势。首先,它是遍历老java版本map的唯一方法。另外一个重要的特性是可以让你在迭代的时候从map中删除entries的(通过调用iterator.remover())唯一方法.如果你试图在For-Each迭代的时候删除entries,你将会得到unpredictable resultes 异常。

    从性能方法看,这个方法等价于使用For-Each迭代

    方法#4 迭代keys并搜索values(低效的)

    Map<Integer, Integer> map = new HashMap<Integer, Integer>();
    for (Integer key : map.keySet()) {
    	Integer value = map.get(key);
    	System.out.println("Key = " + key + ", Value = " + value);
    }
    

    这个方法看上去比方法#1更简洁,但是实际上它更慢更低效,通过key得到value值更耗时(这个方法在所有实现map接口的map中比方法#1慢20%-200%)。如果你安装了FindBugs,它将检测并警告你这是一个低效的迭代。这个方法应该避免

    总结

    如果你只需要使用key或者value使用方法#2,如果你坚持使用java的老版本(java 5 以前的版本)或者打算在迭代的时候移除entries,使用方法#3。其他情况请使用#1方法。避免使用#4方法



    展开全文
  • HashMap遍历和使用

    万次阅读 2017-08-06 17:29:37
    Hashmap的几种遍历方式: hashmap和hashtable的区别

    map的几种遍历方式:
    Map< String, String> map = new HashMap<>();

       map.put("aa", "@sohu.com");
    
       map.put("bb","@163.com");
    
       map.put("cc", "@sina.com");
    
       System.out.println("普通的遍历方法,通过Map.keySet遍历key和value");//普通使用,二次取值
    
       for (String key : map.keySet()) {
    
           System.out.println("key= "+key+" and value= "+map.get(key));
    
       }
    
       System.out.println("通过Map.entrySet使用iterator遍历key和value:");
    
       Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();
    
       while(it.hasNext()){
    
           Map.Entry<String, String> entry = it.next();
    
           System.out.println("key= "+entry.getKey()+" and value= "+entry.getValue());
    
       }
    
       System.out.println("通过Map.entrySet遍历key和value");    //推荐这种,特别是容量大的时候
    
       for(Map.Entry<String, String> entry : map.entrySet()){
    
           System.out.println("key= "+entry.getKey()+" and value= "+entry.getValue());
    
       }
    

      System.out.println(“通过Map.values()遍历所有的value,但不能遍历key”);

       for(String v : map.values()){
    
           System.out.println("value = "+v);
    
       }
    

    HashMap和Hashtable的联系和区别
    实现原理相同,功能相同,底层都是哈希表结构,查询速度快,在很多情况下可以互用,早期的版本一般都是安全的。

    • HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别。主要的区别有:线程安全性,同步(synchronization),以及速度。
    • HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行)。
    • HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。
    • 另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。这条同样也是Enumeration和Iterator的区别。
    • 由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。
      HashMap不能保证随着时间的推移Map中的元素次序是不变的。

    hashmap的特点
    HashMap是map接口的子类,是将键映射到值的对象,其中键和值都是对象,不是线程安全的
    hashMap用hash表来存储map的键
      key是无序唯一,可以有一个为null
      value无序不唯一,可以有对个null
    linkedHashMap使用hash表存储map中的键,并且使用linked双向链表管理顺序

    • 我们用的最多的是HashMap,在Map 中插入、删除和定位元素,HashMap 是最好的选择。如果需要输出的顺序和输入的相同,那么用LinkedHashMap 可以实现,它还可以按读取顺序来排列.

    • HashMap是一个最常用的Map,它根据键的hashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为NULL,允许多条记录的值为NULL。HashMap不支持线程同步,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致性。

    • 如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力。LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的。

    HashMap可以通过下面的语句进行同步:
    Map m = Collections.synchronizeMap(hashMap);


    几大常用集合的效率对比
    这里写图片描述


    展开全文
  • hashMap遍历删除元素

    千次阅读 2019-03-20 18:28:21
    import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; public class Test { public static void main(String[] ar...
    package test;
    
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    import java.util.Map.Entry;
    
    public class Test {
    
    	public static void main(String[] args) {
    		HashMap<String, String> map = new HashMap<String, String>();
    		map.put("1", "a");
    		map.put("2", "b");
    		map.put("3", "c");
    		map.put("4", "d");
    		
    		
    		 for (Iterator<Map.Entry<String, String>> it = map.entrySet().iterator(); it.hasNext(); ) {
    	            Map.Entry<String, String> item = it.next();
    	            String abc = Integer.toHexString(item.hashCode());
    	            it.remove();
    	        }
    		
    		for (Entry<String, String> entry : map.entrySet()) {
    			System.out.println("key"+entry.getKey() +"  value:"+entry.getValue());
    		}
    	}
    
    }

     

    展开全文
  • HashMap遍历的四种方法

    2016-07-12 16:53:00
    在Java中有多种遍历HashMAp的方法。让我们回顾一下最常见的方法和它们各自的优缺点。由于所有的Map都实现了Map接口,所以接下来方法适用于所有Map(如:HaspMap,TreeMap,LinkedMap,HashTable,etc)方法1 使用For-...
  • HashMap遍历删除写在方法内的一个线程里: ``` new Thread(new Runnable() { @Override public void run() { Iterator iterator = three.keySet().iterator(); while (iterator.hasNext()) { … ...
  • hashmap遍历中删除键值对

    千次阅读 2018-07-12 00:06:16
    public class test { public static void main(String[] args) { ... maps = new HashMap&lt;String, String&gt;(); maps.put("10", "AA"); maps.put("11", "BB"
  • 笔者最近在调试项目bug的时候,遇到了一个很奇怪的bug,就是在对hashmap集合进行遍历的时候,同时做了remove操作,这个操作最后导致抛出了java.util.ConcurrentModificationException的错误。 带着疑惑,下面参考着...
  • Java的HashMap遍历方法

    2013-05-03 18:13:44
    HashMap遍历 双击代码全选 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ...
  • System.out.println("--------HashMap遍历------"); Map, String> map=new HashMap,String>(); for(Article a : list){ map.put(a.getId(), a.getTitle()+a.getContent()); } //得到map的所有的键 Set...
  • 原文地址: http://www.javaweb.cc/language/java/032291.shtml第一种: Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter....
  • hashmap遍历时用map.remove方法为什么会报错? 发现问题 笔者最近在调试项目bug的时候,遇到了一个很奇怪的bug,就是在对hashmap集合进行遍历的时候,同时做了remove操作,这个操作最后导致抛出了java.util....
  • hashMap遍历

    2018-08-21 16:26:18
    HashMap遍历 在Java中有多种遍历HashMAp的方法。让我们回顾一下最常见的方法和它们各自的优缺点。由于所有的Map都实现了Map接口,所以接下来方法适用于所有Map(如:HaspMap,TreeMap,LinkedMap,HashTable,etc) ...
  • 1.在java 中,for-each只适用于遍历,当要对集合进行操作的时候,就会导致...所以在**移除遍历移除map中的元素时就不能用迭代器**。 所以,就需要for循环进行遍历,大致是这样的 Set<String> setKeys = maps.keySet();
  • HashMap遍历

    2016-03-20 01:55:57
    查看Map接口,我们发现Map提供三种collection视图: 键集 Set<> keySet():返回此映射中包含的键的 Set 视图。该 set 受映射支持,所以对映射的更改可在此 set 中...set 支持元素移除,通过 Iterator.remove、 Set.re
  • HashMap遍历输出的几种方式  foreach 取出map.entrySet()并获取key和value 1 Map<String, String> map = new HashMap<String, String>(); 2 for (Entry<String, String> entry : ...
  • ArrayList和HashMap遍历选择删除,集合的迭代删除ArrayList的遍历删除方法1方法2方法3(常用方法,推荐)HashMap遍历删除方法1方法2(常用)方法3(常用)(Lambda) ArrayList的遍历删除 ArrayList实现了...
  • java HashMap 高效遍历

    千次阅读 2013-07-23 14:01:10
    2.移除问题 :java.util.concurrentModificationException: 在HaspMap 中移除时会抛出 Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while(iter.hasnext()) { Map.En
  • stack,queue,hashmap遍历

    2017-10-02 22:46:18
    stack的遍历 增强型for循环的遍历方法for(int path:stack){//这里的path可以随便写什么 System.out.println(path+" "); }栈弹出的while遍历方式while(!stack.empty()){//栈的api中只有empty(),没有Empty()或者...
  • Java HashMap 如何正确遍历并删除元素

    千次阅读 2017-08-22 11:07:52
    (一)HashMap遍历    HashMap遍历主要有两种方式:  第一种采用的是foreach模式,适用于不需要修改HashMap内元素的遍历,只需要获取元素的键/值的情况。 HashMap myHashMap; for (Map.entry ite

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 34,708
精华内容 13,883
关键字:

hashmap遍历移除