Day19—集合进阶-3

双列集合的特点

①双列集合一次需要存一对数据,分别为键和值

②键不能重复,值可以重复

③键和值是一一对应的,每一个键只能找到自己对应的值

④键+值这个整体我们称之为"键值对"或者"键值对对象",在Java中叫做"Entry对象"

Map常见的API

map是双列集合的顶层接口,它的功能是全部双列集合都可以继承使用的

Map集合的遍历方式

①键找值

步骤分析:

1.获取所有键的集合。用keySet()方法实现

2.遍历键的集合,获取到每一个键。用增强for实现

3.根据键去找值。用get(Object key)方法实现

java 复制代码
public class MapDemo01 {
    public static void main(String[] args) {
        //创建集合对象
        Map<String, String> map = new HashMap<String, String>();

        //添加元素
        map.put("张无忌", "赵敏");
        map.put("郭靖", "黄蓉");
        map.put("杨过", "小龙女");

        //获取所有键的集合。用keySet()方法实现
        Set<String> keySet = map.keySet();
        //遍历键的集合,获取到每一个键。用增强for实现
        for (String key : keySet) {
            //根据键去找值。用get(Object key)方法实现
            String value = map.get(key);
            System.out.println(key + "," + value);
        }
    }
}
②键值对

步骤分析:

1.获取所有键值对对象的集合

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

2.遍历键值对对象的集合,得到每一个键值对对象

用增强for实现,得到每一个Map.Entry

3.根据键值对对象获取键和值

用getKey()得到键

用getValue()得到值

③Lambda表达式

HashMap

HashMap的特点

①HashMap是Map里面的一个实现类

②特点有键决定:无序、不重复、无索引

③HashMap的底层原理是哈希表结构

④依赖hashCode方法和equals方法保证键的唯一

⑤如果键要存储的是自定义对象,需要重写hashCode和equals方法

java 复制代码
public class A02_HashMapDemo2 {
    public static void main(String[] args) {
        /*
            某个班级80名学生,现在需要组成秋游活动,
            班长提供了四个景点依次是(A、B、C、D),
            每个学生只能选择一个景点,请统计出最终哪个景点想去的人数最多。
        */
        //1.需要先让同学们投票
        //定义一个数组,存储4个景点
        String[] arr = {"A","B","C","D"};
        //利用随机数模拟80个同学的投票,并把投票的结果存储起来
        ArrayList<String> list = new ArrayList<>();
        Random r = new Random();
        for (int i = 0; i < 80; i++) {
            int index = r.nextInt(arr.length);
            list.add(arr[index]);
        }
        //2.如果要统计的东西比较多,不方便使用计数器思想
        //我们可以定义map集合,利用集合进行统计。
        HashMap<String,Integer> hm = new HashMap<>();
        for (String name : list) {
            //判断当前的景点在map集合当中是否存在
            if(hm.containsKey(name)){
                //存在
                //先获取当前景点已经被投票的次数
                int count = hm.get(name);
                //表示当前景点又被投了一次
                count++;
                //把新的次数再次添加到集合当中
                hm.put(name,count);
            }else{
                //不存在
                hm.put(name,1);
            }
        }

        System.out.println(hm);

        //3.求最大值
        int max = 0;
        Set<Map.Entry<String, Integer>> entries = hm.entrySet();
        for (Map.Entry<String, Integer> entry : entries) {
            int count = entry.getValue();
            if(count > max){
                max = count;
            }
        }
        System.out.println(max);
        //4.判断哪个景点的次数跟最大值一样,如果一样,打印出来
        for (Map.Entry<String, Integer> entry : entries) {
            int count = entry.getValue();
            if(count == max){
                System.out.println(entry.getKey());
            }
        }



    }
}

LinkedHashMap

由键决定:有序、不重复、无索引 (有序:保证存储和取出的顺序一致)

原理:哈希表,没和键值对元素额外多了一个双链表的机制记录存储的顺序

java 复制代码
public class A01_LinkedHashMapDemo1 {
    public static void main(String[] args) {

        //1.创建集合
        LinkedHashMap<String,Integer> lhm = new LinkedHashMap<>();

        //2.添加元素
        lhm.put("c",789);
        lhm.put("b",456);
        lhm.put("a",123);
        lhm.put("a",111);

        //3.打印集合
        System.out.println(lhm);

    }
}

TreeMap

特点:

1.底层原理:红黑树结构

2.由键决定特性:不重复、无索引、可排序 (可排序:对键进行排序)

3.默认按诈骗间的从小到大啊进行排序,也可以自己规定键的排序规则

代码书写的两种排序规则:

实现Comparable接口,指定比较规则

创建集合是传递Comparator比较器对象,指定比较规则

java 复制代码
public class A01_TreeMapDemo1 {
    public static void main(String[] args) {
        /*
           TreeMap集合:基本应用
            需求1:
                键:整数表示id
	            值:字符串表示商品名称
	            要求1:按照id的升序排列

	            要求2:按照id的降序排列
         */

        //1.创建集合对象
        //Integer Double 默认情况下都是按照升序排列的
        //String 按照字母再ASCII码表中对应的数字升序进行排列
        //abcdefg ...
        TreeMap<Integer,String> tm = new TreeMap<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                //o1:当前要添加的元素
                //o2:表示已经在红黑树中存在的元素
                return o2 - o1;
            }
        });

        //2.添加元素
        tm.put(5,"可恰可乐");
        tm.put(4,"雷碧");
        tm.put(3,"九个核桃");
        tm.put(2,"康帅傅");
        tm.put(1,"粤利粤");

        //3.打印集合
        System.out.println(tm);


    }
}
相关推荐
2501_941982051 小时前
马年 Go 篇:高并发企微机器人开发实战
开发语言·golang·企业微信
!停1 小时前
数据结构二叉树—链式结构(中)
java·数据结构·算法
郝学胜-神的一滴1 小时前
Python中的Dict子类:优雅扩展字典的无限可能
开发语言·python
dcmfxvr2 小时前
【无标题】
java·linux·前端
康小庄2 小时前
Java读写锁降级
java·开发语言·spring boot·python·spring·java-ee
流云细水2 小时前
Spec(规格说明书)与Skill(技能库)实操指南
java·人工智能
毕设源码-钟学长2 小时前
【开题答辩全过程】以 基于Java的停车场信息管理系统设计与实现为例,包含答辩的问题和答案
java·开发语言
Mr -老鬼2 小时前
基于 Go 的脚本平台 APP 云控系统
开发语言·后端·golang
rannn_1112 小时前
【苍穹外卖|Day7】缓存菜品、缓存套餐、添加购物车、查看购物车、清空购物车
java·spring boot·redis·后端·缓存·项目