Map集合体系

62 阅读3分钟

一、Map集合的概述

1、Map集合概述和使用

  • Map集合是一种双列集合,每个元素包含两个数据
  • Map集合的每个元素的格式:key=value(键值对元素)
  • Map集合也被称为“键值对集合”

2、Map集合整体格式

  • Collection集合的格式:[元素1,元素2,元素3..]
  • Map集合的完整格式:[key1=value1, key2=value2, key3=value3,..]

二、Map集合体系特点

1、Map集合体系

image.png

2、Map类集合体系特点

  • Map集合的特点都是由键决定的。
  • Map集合的键都是无序,不重复的,无索引的,值不做要求(可以重复)。
  • Map集合后面重复的键对应的值会覆盖前面重复键的值。
  • Map集合的键值对都可以为null。

3、Map集合实现类特点

  • HashMap:元素按照键是无序,不重复,无索引,值不做要求(与Map体系一致)
  • LinkedHashMap:元素按照键是有序,不重复,无索引,不做要求。
  • TreeMap:元素按照键是排序,不重复,无所引导的,值不做要求。
Map<String, Integer> maps = new LinkedHashMap<>();
maps.put("a", 3);
maps.put("b", 1);
maps.put("c", 100);
maps.put("b", 100);
maps.put(null, null);
System.out.println(maps);//{a=3, b=100, c=100, null=null}

三、Map集合常用API

1、Map集合

Map是双列结合的祖宗接口,它的功能是全部双列集合都可以继承使用的。

2、常用API

  • public V put(K key, V value): 把指定的键与指定的值添加到Map集合中。

  • public V remove(Object key): 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。

  • public V get(Object key) 根据指定的键,在Map集合中获取对应的值。

  • public Set<K> keySet(): 获取Map集合中所有的键,存储到Set集合中。

  • public Set<Map.Entry<K,V>> entrySet(): 获取到Map集合中所有的键值对对象的集合(Set集合)。

  • public boolean containKey(Object key):判断该集合中是否有此键。

  • public boolean containValue(Object value):判断该集合中是否有此值。

//1、添加元素:无序、不重复、无索引
        Map<String, Integer> maps = new HashMap<>();
        maps.put("a", 10);
        maps.put("b", 20);
        maps.put("a", 100);
        maps.put("c", 100);
        maps.put("d", 10);
        maps.put("e", 10);
        System.out.println(maps);//{a=100, b=20, c=100, d=10, e=10}

        //2、清空集合
//        maps.clear();
//        System.out.println();//{}

        //3、判断集合是否为空,为空返回true ,反之
        System.out.println(maps.isEmpty());//false

        //4、根据键获取对应值:public V get(Object key)
        Integer key = maps.get("a");
        System.out.println(key);//100

        //5、根据键删除整个元素。(删除键会返回键的值)
        System.out.println(maps.remove("a"));//100
        System.out.println(maps);//{b=20, c=100, d=10, e=10}

        //6、判断是否包含某个键 ,包含返回true ,反之
        System.out.println(maps.containsKey("b"));//true
        System.out.println(maps.containsKey("a"));//false

        //7、判断是否包含某个值。
        System.out.println(maps.containsValue(100));//treu
        System.out.println(maps.containsValue(11));//false

        //8、获取全部键的集合:public Set<K> keySet()
        Set<String> keys = maps.keySet();
        System.out.println(keys);//[b, c, d, e]

        //9、获取全部值的集合:Collection<V> values();
        Collection<Integer> values = maps.values();
        System.out.println(values);//[20, 100, 10, 10]

        //10、集合的大小
        System.out.println(maps.size());//4

        //11、合并其他Map集合。
        Map<String, Integer> map1 = new HashMap<>();
        map1.put("a", 1);
        map1.put("b", 100);
        Map<String, Integer> map2 = new HashMap<>();
        map2.put("b", 1);
        map2.put("c", 100);
        map1.putAll(map2);//把集合map2的元素拷贝一份到map1中去
        System.out.println(map1);//{a=1, b=1, c=100}
        System.out.println(map2);//{b=1, c=100}

四、MAp集合的遍历

1、键找值

  • 先获取Map集合的全部键的Set集合。
  • 遍历键的Set集合,然后通过键提取对应值。

涉及的API:

Set<K> keySet()获取所有键的集合

V get(Object key)根据键获取值

//1、键找值:第一步,先拿到集合的全部值
Set<String> keys = maps.keySet();
//2、第二步,遍历每个键,根据键取值
for (String key : keys) {
    int value = maps.get(key);
    System.out.println(key + " =====> " + value);

结果为:

image.png

2、键值对

  • 先把Map集合转化成Set结合,Set集合中每个元素都是键值对实体类型了。
  • 遍历Set集合,然后提取键以及提取值。

键值对涉及到的API:

Set<Map.Entry<K,V>> entrySet()获取所有键值对对象的集合

K getKey()获得键

K getValue()获得值

//1、把Map集合转成Set集合
Set<Map.Entry<String, Integer>> entries = maps.entrySet();
//2、开始遍历
for (Map.Entry<String, Integer> entry : entries){
    String key = entry.getKey();
    int value = entry.getValue();
    System.out.println(key + " ====> " + value);
}

3、lambda表达式

maps.forEach((k,v) ->{
        System.out.println(k + " ====> " + v);

});

五、Map集合案例

1、需求

80名学生,现在需要组成秋游活动,提供了四个景点ABCD,每个学生只能选择一个景点,统计出最终那个景点想去的人数最多。

2、分析

  • 将80个学生选择的数据拿到程序中去
  • 定义Map集合用于存储最终统计的结果
  • 遍历80个学生选择的数据,看Map集合中是否存在,不存在存入“数据=1”,存在则其对应值+1
//1、把88个学生选择的数据拿进来
String[] selects = {"A", "B", "C", "D"};
StringBuilder sb = new StringBuilder();
Random r = new Random();
for (int i = 0; i < 80; i++) {
    sb.append(selects[r.nextInt(selects.length)]);
}
System.out.println(sb);
//2、定义一个Map集合记录最终的统计结果,键是景点,值是选择的数量
Map<Character, Integer> infos = new HashMap<>();
//3、遍历80个学生选择的数据
        for (int i = 0; i < sb.length(); i++) {
            //4、提取当前选择景点字符
            char ch = sb.charAt(i);
            //5、判断Map集合中是否存在这个键
            if (infos.containsKey(ch)){
                //让其值 +1
                infos.put(ch, infos.get(ch) + 1);
            }else {
                //说明此景点是第一次被选
                infos.put(ch, 1);
            }
        }

//6、输出集合
System.out.println(infos);

结果为:

image.png

六、 HashMap

1、HashMap的特点

  • HashMap是Map里面的一个实现类。特点都是由键决定的:无序、不重复、无索引。
  • 无特有方法,直接用Map里面的方法就可以了。
  • HashMap和HashSet底层原理是一模一样的,都是哈希表结构,只是HashMap的每个元素包含两个值而已。
  • 实际上Se系列结合的底层就是Map实现的,只是Set集合中的元素只要键数据,不要值数据而已。

七、LinkedHashMap

1、概述和特点

  • 由键决定:有序,不重复,无索引
  • 这里的有序是指的保证存储和取出的元素顺序一致
  • 原理:底层数据结构依然哈希表,只是每个键值对元素又额外多了一个双链表机制记录存储的顺序

八、TreeMap

1、TreeMap集合概述和特点

  • 由键决定特性:不重复、无索引、可排序
  • 可排序:按照键数据的大小默认升序排序。只能对键排序。
  • 注意:TreeMap集合是一定要排序的,可以默认排序,也可以将键按照指定的规则进行排序

2、TreeMap集合自定义排序规则有两种

  • 类实现Comparable接口,重写比较规则
  • 集合自定义comparable比较器对象,重写比较规则
Map<Student, String> maps = new TreeMap<>(new Comparator<Student>() {
    @Override
    public int compare(Student o1, Student o2) {
        return o1.getAge() - o2.getAge();
    }
});
maps.put(new Student("a",19,'男'), "one");
maps.put(new Student("b",18,'男'), "two");
maps.put(new Student("c",20,'男'), "three");
System.out.println(maps);

结果为:

image.png