菜鸟之路Day10一一集合进阶(三)

菜鸟之路Day10一一集合进阶(三)

作者:blue

时间:2025.1.28

文章目录

  • 菜鸟之路Day10一一集合进阶(三)
    • 0.概述
    • 1.双列集合概述
    • 2.Map
      • 2.1Map的常见API
      • 2.2Map的遍历方式
    • 3.HashMap
    • 4.LinkedHashMap
    • 5.TreeMap

0.概述

文章学习自黑马程序员BV1yW4y1Y7Ms,今天是甲辰龙年最后一天,除夕,祝大家蛇年快乐。

1.双列集合概述

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

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

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

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

体系结构

在这里插入图片描述

2.Map

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

2.1Map的常见API

package MapAPI;

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

public class MapAPIDemo {
    public static void main(String[] args) {
        //因为Map是一个接口所以只能创建它的实现类对象
        Map<String,String> mp = new HashMap<>();

        //1.V put(K key,V value) 添加元素
        //在添加数据的时候,如果键不存在,那么直接把键值对对象添加到map集合当中
        //在添加数据的时候,如果键是存在的,那么会把原有的键值对对象覆盖,会把被覆盖的值进行返回
        mp.put("郭靖","黄蓉");
        mp.put("杨过","小龙女");
        mp.put("端木燕","灵灵");
        String res = mp.put("端木燕","欧克瑟");
        System.out.println(mp);
        System.out.println(res);//灵灵被替换了

        System.out.println("==========================");

        //2.V remote(Object key)  根据键删除键值对元素
        String res1 = mp.remove("杨过");
        System.out.println(mp);//杨过被删了
        System.out.println(res1);//返回值是小龙女

        System.out.println("==========================");

        //3.void clear() 移除所有的键值对元素

        //4.boolean containsKey(Object key) 判断集合是否包含指定的键
        System.out.println(mp.containsKey("郭靖"));//true
        System.out.println(mp.containsKey("杨过"));//false

        System.out.println("==========================");

        //5.boolean containsValue(Object value) 判断集合是否包含指定的值
        System.out.println(mp.containsValue("黄蓉"));//true

        System.out.println("==========================");

        //6.boolean isEmpty()   判断集合是否为空
        System.out.println(mp.isEmpty());//false,说明不空

        System.out.println("==========================");

        //7.int size()  集合长度,也就是集合中键值对的个数
        System.out.println(mp.size());//2
    }
}

2.2Map的遍历方式

方式一:键找值,将键放入单列集合中,遍历单列集合

package MapAPI;

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

public class MapDemo1 {
    public static void main(String[] args) {
        Map<String,String> mp = new HashMap<>();
        mp.put("杨过","小龙女");
        mp.put("郭靖","黄蓉");
        mp.put("张无忌","赵敏");

        //获取所有的键,把键都放到单列集合中
        Set<String> set = mp.keySet();
        for(String key:set){
            System.out.println(key+"<->"+mp.get(key));//获取对应的value
        }
    }
}

方式二:键值对(Entry对象),通过一个方法获取一个键值对对象,返回一个Set集合

package MapAPI;

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

public class MapDemo1 {
    public static void main(String[] args) {
        Map<String,String> mp = new HashMap<>();
        mp.put("杨过","小龙女");
        mp.put("郭靖","黄蓉");
        mp.put("张无忌","赵敏");

        Set<Map.Entry<String,String>> entries = mp.entrySet();
        for(Map.Entry<String,String> entry:entries){
            System.out.println(entry.getKey()+"->"+entry.getValue());
        }
    }
}

方式三:Lambda表达式遍历

package MapAPI;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.function.BiConsumer;

public class MapDemo1 {
    public static void main(String[] args) {
        Map<String,String> mp = new HashMap<>();
        mp.put("杨过","小龙女");
        mp.put("郭靖","黄蓉");
        mp.put("张无忌","赵敏");

        //匿名内部类
        mp.forEach(new BiConsumer<String, String>() {
            @Override
            public void accept(String key, String value) {
                System.out.println(key+"->"+value);
            }
        });

        System.out.println("===============================");

        //Lambda表达式
        mp.forEach((String key, String value)->{
            System.out.println(key+"->"+value);
        });
    }
}

3.HashMap

特点:①无序,不重复,无所引

​ ②HashMap底层是哈希表结构的

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

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

练习一:

创建一个HashMap集合,键是学生对象,值是籍贯String

要求:同姓名,同年龄认为是同一个学生

package MapAPI;

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

public class HashMapDemo1 {
    public static void main(String[] args) {
        HashMap<Student,String> hm = new HashMap<>();
        Student s1 = new Student("zhangsan",23);
        Student s2 = new Student("lisi",23);
        Student s3 = new Student("wangwu",23);

        hm.put(s1,"guangdong");
        hm.put(s2,"jiangsu");
        hm.put(s3,"shandong");

        Student s4 = new Student("zhangsan",23);
        hm.put(s4,"zhejiang");//因为我们重写了hashCode方法,所以s4被认为是重复的对象,故zhangsan的籍贯被替换成zhejiang

        Set<Map.Entry<Student,String>> entries = hm.entrySet();
        for(Map.Entry<Student,String> entry:entries){
            System.out.println(entry.getKey().getName()+" "+entry.getKey().getAge()+" "+entry.getValue());
        }
    }
}

练习二:

某个班级80名学生,现在需要组成秋游活动,班长提供了四个景点依次是(A,B,C,D),每个学生只能选择一个景点,请统计出最终哪个景点想去的人数最多。

package MapAPI;

import java.util.*;

public class HashMapDemo2 {
    public static void main(String[] args) {
        String[] arr = {"A","B","C","D"};

        //随机投票
        ArrayList<String> list = new ArrayList<>();
        Random rd = new Random();
        for(int i=0;i<80;i++){
            int index = rd.nextInt(4);
            list.add(arr[index]);
        }


        HashMap<String,Integer> hm = new HashMap<>();

        for(String name : list){
            if(hm.containsKey(name)){//先判断存不存在
                int cnt = hm.get(name);//存在先加
                cnt++;
                hm.put(name,cnt);
            }
            else {//不存在就更新,值为1
                hm.put(name,1);
            }
        }

        System.out.println(hm);

        //获取最大值
        int max=0;
        Set<Map.Entry<String,Integer>> entries = hm.entrySet();
        for(Map.Entry<String,Integer> entry : entries){
            int cnt = entry.getValue();
            if(cnt>max) max = cnt;
        }
        System.out.println(max);


        //最大值所在的景点
        for(Map.Entry<String,Integer> entry : entries){
            int cnt = entry.getValue();
            if(cnt==max) System.out.println(entry.getKey());
        }

    }
}

4.LinkedHashMap

特点:①由键决定:有序,不重复,无索引

​ ②这里的有序是指保证存储和取出的元素顺序一致

​ 原理:底层数据结构是哈希表,只是每个键值对元素又额外多了一个双向链表的机制记录存储的顺序

除了有序,它的特点和其他双列集合的实现类都一样,在此就不过多赘述了。

5.TreeMap

①TreeMap跟TreeSet的底层原理一样,都是红黑树结构

②由键决定特性:不重复,无索引,可排序

③可排序:对键进行排序

④注意:默认按照键的从小到大进行排序,也可以自己规定键的排序规则

代码书写两种排序规则:

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

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

基本应用:

需求1:

​ 键:整数表示id;

​ 值:字符串表示商品名称;

​ 要求:按照id的升序排列,按照id的降序排列

public class TreeMapDemo1 {
    public static void main(String[] args) {
        /*TreeMap<Integer,String> tm = new TreeMap<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1-o2;//升序
                //return o2-o1 降序
            }
        });*/

        //Lambda表达式
        TreeMap<Integer,String> tm = new TreeMap<>(
           (Integer o1, Integer o2)->{
                return o1-o2;//升序
                //return o2-o1 降序
            }
        );
        tm.put(4,"aaa");
        tm.put(2,"aaa");
        tm.put(7,"ggg");
        System.out.println(tm);
    }
}

需求2:

​ 键:学生对象

​ 值:籍贯

​ 要求:按照学生年龄的升序排列,年龄一样按照姓名的字母排列,同姓名视为同一个人

package MapAPI;

import java.util.Objects;

public class Student implements Comparable<Student>{
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }


    //实现Comparable接口,重写compareTo方法
    @Override
    public int compareTo(Student o) {
        //按照学生年龄的升序排列,年龄一样按照姓名的字母排列,同姓名视为同一个人
        int i = this.getAge()-o.getAge();
        i=i==0?this.getName().compareTo(o.getName()):i;
        return i;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
public class TreeMapDemo2 {
    public static void main(String[] args) {
        TreeMap<Student,String> hm = new TreeMap<>();
        Student stu1 = new Student("zhangsan",17);
        Student stu2 = new Student("lisi",17);
        Student stu3 = new Student("wangwu",13);
        Student stu4 = new Student("zhangsan",17);

        hm.put(stu1,"广东");
        hm.put(stu2,"浙江");
        hm.put(stu3,"江苏");
        System.out.println(hm.put(stu4,"山东"));//由于stu4和stu1是一个人,所以广东被替换

        System.out.println(hm);
    }
}

需求3:

​ 字符串“aababcabcdabcde”

​ 请统计字符串中每一个字符出现的次数,并按照以下格式输出

​ 输出结果:a(5) b(4) c(3) d(2) e(1)

public class TreeMapDemo3 {
    public static void main(String[] args) {
        String str = "aababcabcdabcde";
        TreeMap<Character,Integer> tm = new TreeMap<>();
        for(int i=0;i<str.length();i++){
            char ch = str.charAt(i);
            if(tm.containsKey(ch)){//看看这个键在不在
                int cnt = tm.get(ch);
                cnt++;
                tm.put(ch,cnt);
            }
            else{
                tm.put(ch,1);
            }
        }
        Set<Map.Entry<Character,Integer>> entries = tm.entrySet();
        for(Map.Entry<Character,Integer> entry : entries){
            System.out.print(entry.getKey()+"("+entry.getValue()+")");
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/961155.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2001-2021年 全国各地级市宽带接入用户统计数据

2001-2021年 全国各地级市宽带接入用户统计数据.zip 2001-2021年 全国各地级市宽带接入用户统计数据.ziphttps://download.csdn.net/download/2401_84585615/89575921 2001-2021年全国各地级市宽带接入用户统计数据反映了中国各地宽带接入服务的发展趋势。随着互联网的普及和…

深入探讨数据库索引类型:B-tree、Hash、GIN与GiST的对比与应用

title: 深入探讨数据库索引类型:B-tree、Hash、GIN与GiST的对比与应用 date: 2025/1/26 updated: 2025/1/26 author: cmdragon excerpt: 在现代数据库管理系统中,索引技术是提高查询性能的重要手段。当数据量不断增长时,如何快速、有效地访问这些数据成为了数据库设计的核…

C基础寒假练习(3)

一、求数组中的第二大值 #include <stdio.h> int main() {int arr[] {12, 35, 1, 10, 34, 1};int size sizeof(arr) / sizeof(arr[0]);if (size < 2) {printf("数组元素不足两个\n");return 0;}int first -2147483648, second -2147483648; // 使用IN…

Vue 响应式渲染 - 待办事项简单实现

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue 响应式渲染 - 待办事项简单实现 目录 待办事项简单实现 页面初始化 双向绑定的指令 增加留言列表设置 增加删除按钮 最后优化 总结 待办事项简单实现 页面初始化 对页面进行vue的引入、创建输入框和按钮及实例化V…

计算机毕业设计Django+Tensorflow音乐推荐系统 机器学习 深度学习 音乐可视化 音乐爬虫 知识图谱 混合神经网络推荐算法 大数据毕设

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

新增文章功能

总说 过程参考黑马程序员SpringBoot3Vue3全套视频教程&#xff0c;springbootvue企业级全栈开发从基础、实战到面试一套通关_哔哩哔哩_bilibili 之前又偷懒几天。回老家没事干&#xff0c;玩也玩不好&#xff0c;一玩老是被家里人说。写代码吧还是&#xff0c;他们都看不懂&a…

Oracle PMON进程清洗功能

PMON进程 简介 1&#xff0c;在进程非正常中断后&#xff0c;做清理工作。例如&#xff1a;dedicated server失败了或者因为一些原因被杀死&#xff0c;这是PMON的工作分两种。第一&#xff0c;是对dedicated server所做的工作进行恢复或撤销。第二&#xff1a;是释放dedicate…

2025美赛数学建模C题:奥运金牌榜,完整论文代码模型目前已经更新

2025美赛数学建模C题&#xff1a;奥运金牌榜&#xff0c;完整论文代码模型目前已经更新&#xff0c;获取见文末名片

【数据结构】空间复杂度

目录 一、引入空间复杂度的原因 二、空间复杂度的分析 ❥ 2.1 程序运行时内存大小 ~ 程序本身大小 ❥ 2.2 程序运行时内存大小 ~ 算法运行时内存大小 ❥ 2.3 算法运行时内存大小 ❥ 2.4 不考虑算法全部运行空间的原因 三、空间复杂度 ❥ 3.1空间复杂度的定义 ❥ 3.2 空…

[Java]快速入门

java是什么 Java是美国的sun 公司(Stanford University Network)在1995年推出的一门计算机高级编程语言 sun公司于2009年被Oracle(甲骨文)公司收购。 普遍认同lava的联合创始人之一: 詹姆斯高斯林(James Gosling)为Java之父。 Java是世界上最流行的编程语言之一&#xff0c;…

数据分析系列--②RapidMiner导入数据和存储过程

一、下载数据 点击下载AssociationAnalysisData.xlsx数据集 二、导入数据 1. 在本地计算机中创建3个文件夹 2. 从本地选择.csv或.xlsx 三、界面说明 四、存储过程 将刚刚新建的过程存储到本地 Congratulations, you are done.

【源码+文档+调试讲解】基于springboot的高校实验室预约系统

摘 要 高校实验室预约系统是一款专为高等教育机构设计的在线管理工具&#xff0c;旨在简化实验室资源的分配和使用。通过该系统&#xff0c;学生和教师可以轻松查看实验室的空闲时间&#xff0c;并进行实时预约。系统支持不同用户权限设置&#xff0c;确保资源合理分配&#x…

MIMIC-IV数据部署(博主较忙,缓慢更新)

1. 用到的数据准备 在下面的网站&#xff0c;注册、申请、推荐人从邮箱里帮忙确认。 通过后&#xff0c;拉到页面的最下面。把那个将近10个G的文件给下载下来。 可以在晚上睡觉的时候下载&#xff0c;第二天早上起来“收数据”。 MIMIC-IV v3.1 2. 用到的软件准备 7-zip …

6. 使用springboot做一个音乐播放器软件项目【1.0版项目完结】附带源码~

#万物OOP 注意&#xff1a; 本项目只实现播放音乐和后台管理系统。 不分享任何音乐歌曲资源。 上一篇文章我们 做了音乐播放器后台的功能。参考地址&#xff1a; https://jsonll.blog.csdn.net/article/details/145214363 这个项目已经好几天也没更新了&#xff0c;因为临近放…

macbook安装go语言

通过brew来安装go语言 使用brew命令时&#xff0c;一般都会通过brew search看看有哪些版本 brew search go执行后&#xff0c;返回了一堆内容&#xff0c;最下方展示 If you meant "go" specifically: It was migrated from homebrew/cask to homebrew/core. Cas…

装机爱好者的纯净工具箱

对于每一位电脑用户来说&#xff0c;新电脑到手后的第一件事通常是检测硬件性能。今天为大家介绍一款开源且无广告的硬件检测工具——入梦工具箱。 主要功能 硬件信息一目了然 打开入梦工具箱&#xff0c;首先看到的是硬件信息概览。这里不仅包含了内存、主板、显卡、硬盘等常…

数据分析系列--③RapidMiner算子说明及数据预处理

一、算子说明 1 新建过程 2 算子状态灯 状态灯说明: (1)状态指示灯&#xff1a; 红色:指示灯说明有参数未被设置或输入端口未被连接等问题; 黄色:指示灯说明还未执行算子&#xff0c;不管配置是否基本齐全; 绿色:指示灯说明一切正常&#xff0c;已成功执行算子。 (2)三角…

PVE 虚拟机安装 Debian 无图形化界面服务器

Debian 安装 Debian 镜像下载 找一个Debian镜像服务器&#xff0c;根据需要的版本和自己硬件选择。 iso-cd/&#xff1a;较小&#xff0c;仅包含安装所需的基础组件&#xff0c;可能需要网络访问来完成安装。有镜像 debian-12.9.0-amd64-netinst.isoiso-dvd/&#xff1a;较…

操作系统指定用户密码永不过期

背景 实际生产环境中&#xff0c;数据中心操作系统通常会有基线要求&#xff08;比如等保之类&#xff09;&#xff0c;要求设置操作系统密码有效期&#xff0c;但是infra团队或者操作系统管理员或者某些业务配置使用的操作系统用户又需要密码不能不停修改&#xff08;或者说一…

npm:升级自身时报错:EBADENGINE

具体报错信息如下&#xff1a; 1.原因分析 npm和当前的node版本不兼容。 // 当前实际版本: Actual: {"npm":"10.2.4","node":"v20.11.0"}可以通过官网文档查看与自己 node 版本 兼容的是哪一版本的npm&#xff0c;相对应进行更新即可…