Java集合总结下-Map接口

一, 集合概览

  • Map接口是一种双列集合.它的每一个元素都是一个键值对(Key-Value).键和值之间存在一种对应关系,称为映射.
  • 从Map集合中访问元素时,只要指定了Key,就能找到对应的Value.

二, Map接口中的常用方法

2.1, Map接口中的基本方法:

补充:

  1. 调用 V remove(Object key)删除Map中元素时,在成功删除后会返回被删除键所对应的Key值. 若Map没有对应的Key值,则返回 null;
  2. 如果我们往Map中放入了相同键的键值对,这个键对应的值会发生更新噢!

代码示例:

package MapDemo;

import java.util.HashMap;
import java.util.Map;

public class BasicMapDemo {
    public static void main(String[] args) {
        Map<Integer,String> map = new HashMap<Integer,String>();
        /// put添加元素
        map.put(01,"cat");
        map.put(02,"dog");
        map.put(03,"chiken");
        map.put(04,"dragon");
        map.put(03,"sb");

        System.out.println("put键值对后直接打印:"+ map);
        ///remove 移除元素
        System.out.println(map.remove(05));
        System.out.println(map.remove(03));
        System.out.println(map);

        //判断键或值的存在
        System.out.println(map.containsKey(02));
        System.out.println(map.containsValue("chiken"));

        ///判断集合的长度(键值对的个数)
        System.out.println(map);
        System.out.println(map.size());

        //清空集合;
        map.clear();
        //判断集合是否为空
        System.out.println(map.isEmpty());

    }
}

输出结果:

2.2, Map接口中的获取方法:

补充:
Object get(Object key)----> 返回指定键所映射的值.如果没有此键 则返回null;

  • V map.getOrDefault( key, val); ===> 此方法意思是获取到map中对应key的值, 如果不存在, 则把这个key的值设置为val; ===> 在滑动窗口的典型例题(lt. 76 最小覆盖子串)中用到了这个方法;

代码示例:

package MapDemo;

import java.util.*;

public class AccessMapDemo {
    public static void main(String[] args) {
        Map<Integer,String> map = new HashMap<Integer,String>();
        /// put添加元素
        map.put(01,"cat");
        map.put(02,"dog");
        map.put(03,"chiken");
        map.put(04,"dragon");
        map.put(03,"sb");

        System.out.println("put键值对后直接打印:"+ map);

        ///根据键获取值,键不存在,则返回null
        System.out.println(map.get(03));
        System.out.println(map.get(05));

        //获取所有键的集合  map.keySet()
        ///   ctrl + shift +V 自动生成=左边的部分(即数据类型 变量名)
        Set<Integer> key = map.keySet();
        for(int i : key){
            System.out.println(i);
        }

        //获取所有值的集合 map.values()
        ///   ctrl + shift +V 自动生成=左边的部分(即数据类型 变量名)
        Collection<String> values = map.values();
        Iterator<String> it = values.iterator();
        while(it.hasNext()){
            System.out.println(it.next());4/
        }
    }
}

三, 对Map的遍历

3.1, 利用keySet()根据键去找值

3.2, 利用entrySet()映射关系取出键和值

3.3, 利用values()直接取出map的值

在Map中,还提供了一个values()方法,通过这个方法可以直接获取Map中存储所有值的一个Collection集合.

三种遍历的代码示例:

package MapDemo;
import java.util.Map;
import java.util.HashMap;
import java.util.Set;

public class MapTraverseDemo {
    public static void main(String[] args) {
        Map<String,String> hashMap = new HashMap<String,String>();

        hashMap.put("2","Iron man");
        hashMap.put("1","Spider man");
        hashMap.put("4","Keyboard man");
        hashMap.put("3","Green-Hat man");

        System.out.println(hashMap);
        Map的两种遍历方式;
        ///1.先遍历Map集合中所有的键,再根据键获取对应的值;
                先遍历Map集合所有的键,用keySet()实现;
        Set<String> keySet = hashMap.keySet();
                ///把键放在Set集合中并使用增强for循环读取;
        for(String keySet : keySet){
                //每读出一个键,就去使用get(Object key)获取值;
            System.out.println(keySet+":"+hashMap.get(keySet));
        }


        ///2. 根据entryKey()获得映射关系并取出键和值;
            //利用entryKey()得到键值映射关系
        Set<Map.Entry<String,String>> entrySet = hashMap.entrySet();
        for(Map.Entry<String,String> entry : entrySet){
                ///遍历映射关系取出键和值.
            System.out.println(entry.getKey()+":"+entry.getValue());
        }


        ///3, 利用 values()获得Map中的值
        Collection<String> values = hashMap.values();
        Iterator<String> iterator = values.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}
  • 输出结果:


对第二种遍历方式的补充说明:

  1. 在第二种遍历方式中,我们首先调用Map对象的entrySet()方法获得存储在Map中的键值映射的一个Set集合,这个Set集合中存放了 Map.Entry类型的元素(Entry是Map的接口内部类),每个Map.Entry对象代表Map中的一个键值对.
  2. 然后我们迭代Set集合,获得每一个映射对象,并分别调用映射对象的 getKey() 和 getValues()方法获取键和值.

四, HashMap 和 LinkedHashMap的辨析 ======4/12

结论:

  • 从 cp3中对HashMap的遍历可知,HashMap集合在遍历时会根据key值对键值对进行排序. 所以HashMap集合迭代出元素的顺序和存入的顺序是不一致的,要想让存和取的顺序一致,我们可以使用 LinkedHashMap.
  • LinkedHashMap是HashMap 的子类,它与LinkedList一样也使用双向链表去维护内部元素的关系,从而使得Map元素迭代的顺序与存入的顺序一致;

代码示例:

package MapDemo;

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;

public class LinkedHashMapDemo {
    public static void main(String[] args) {
        Map<Integer,String> LHMap = new LinkedHashMap<Integer,String>();

        LHMap.put(2,"Iron man");
        LHMap.put(1,"Spider man");
        LHMap.put(4,"Keyboard man");
        LHMap.put(3,"Green-Hat man");

        //1. keySet()
        Set<Integer> keySet = LHMap.keySet();
        for(Integer key : keySet){
            System.out.println(key+":"+LHMap.get(key));
        }
        System.out.println("======================================");
        ///2.entrySet()
        Set<Map.Entry<Integer,String>> entrySet = LHMap.entrySet();
        for(Map.Entry<Integer,String> entry : entrySet){
            System.out.println(entry.getKey()+":"+entry.getValue());
        }
    }
}

输出结果:

由此可见, LinkedHashMap是有序的(存取的次序是一致的);

拓展: 集合中元素的比较和转换
深入:重要集合接口的源码剖析

posted @ 2022-05-26 20:31  青松城  阅读(56)  评论(0编辑  收藏  举报