HashMap的几种遍历方式

1、Map的简单介绍

Map是双列集合顶级父接口,主要实现类有HashMap、TreeMap、HashTable、LinkedHashMap。

  • HashMap
    首先HashMap是线程不安全的,根据key的HashCode值来存储数据,根据key可以直接获取它的value,HashMap最多只允许一条记录的key值为null。允许多提条记录的值为null。当put相同的key值时,数据会覆盖
  • TreeMap
    能够把它保存的记录根据key排序也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的。TreeMap不允许key的值为null;线程不安全。
  • HashTable
    key和value都不可以是null;支持线程的同步,写入比较慢。
  • LinkedHashMap
    保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.在遍历的时候会比HashMap慢。key和value均允许为空,线程不安全。

2、HashMap的排序

  1. keySet方法,通过 map1.keySet() 获取key 通过key得到value(keySet()遍历是先将keys存入Set集合,再遍历该集合中的keys,再用 遍历得到的key取得相应的值)如果说把丈夫作为主键,keySet就相当于拿到所有的丈夫,再根据丈夫去看他的妻子是谁。
	public void test5() throws Exception{
        Map<String, Integer> map = new HashMap<String, Integer>();
        map.put("数学", 20);
        map.put("英语", 18);
        map.put("语文", 17);
        map.put("历史", 25);
        //这里key值相同时间,意味着修改value的值,并不会出现两个历史
        map.put("历史", 30);

        //通过 map1.keySet() 获取key  通过key得到value
        for (String key : map.keySet()) {
            Integer value = map.get(key);
            System.out.println("key : "+key+" value : "+value);
        }
    }
  1. entrySet方法,(entrySet()是把所有的键值对存入Set集合。一对一对的存的。得到所有的键值对,直接遍历该集合得到单个的键值对Map.Entry的对象。再用键值对这种类的方法getKey()和getValue()得到相应的键与值)entrySet相当于是拿到所有的结婚证,根据结婚证直接看丈夫和妻子的关系。
    public void test6() throws Exception{
        Map<String, Integer> map = new HashMap<String, Integer>();
        map.put("数学", 20);
        map.put("英语", 18);
        map.put("语文", 17);
        map.put("历史", 25);
        //这里key值相同时间,意味着修改value的值,并不会出现两个历史
        map.put("历史", 30);

        for (Map.Entry<String, Integer> entry : map.entrySet()){
            System.out.println("key : "+entry.getKey()+" value : "+entry.getValue());
        }
    }
  1. 只遍历值,这种方式只能获取到值,获取不到key
    public void test7() throws Exception{
        Map<String, Integer> map = new HashMap<String, Integer>();
        map.put("数学", 20);
        map.put("英语", 18);
        map.put("语文", 17);
        map.put("历史", 25);
        //这里key值相同时间,意味着修改value的值,并不会出现两个历史
        map.put("历史", 30);

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