【从入门到起飞】JavaSE—带你了解Map,HashMap,TreeMap的使用方法

news2024/11/24 2:19:01

🎊专栏【Java基础】
🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。
🎆音乐分享【The truth that you leave】
🥰欢迎并且感谢大家指出我的问题

文章目录

  • 🌺双列集合的特点
  • 🎄Map
  • 🍔Map常用的API
    • ⭐创建Map集合的对象
    • ⭐添加元素
      • ✨注意
    • ⭐移除元素
    • ⭐清空元素
    • ⭐判断是否存在某个 键 / 值
    • ⭐判断集合是否为空
    • ⭐判断集合的长度
  • 🍔Map的遍历方式
    • ⭐方法一:键找值
    • ⭐方法二:键值对
      • ✨分析一下Map.Entry<String,String>
    • ⭐方法三:Lambda表达式
      • ✨分析一下new BiConsumer<String, String>()
  • 🎄HashMap
  • 🍔特点
  • 🍔例子
    • ⭐注意
  • 🎄LinkHashMap
  • 🍔特点
  • 🎄TreeMap
  • 🍔特点
    • ⭐两种排序规则

在这里插入图片描述

🌺双列集合的特点

在这里插入图片描述

  1. 双列集合一次需要存一对数据,分别是键和值
  2. 键不能重复,值可以重复
  3. 键和值是一一对应的,每一个键都能找到自己对应的值
  4. 键+值 这个整体我们称为"键值对"或者"键值对对象",在Java中称为"Entry对象"

🎄Map

🍔Map常用的API

⭐创建Map集合的对象

在这里插入图片描述

⭐添加元素

put("元素1","元素2");

在这里插入图片描述

✨注意

在添加元素的时候,如果键不存在,那么直接把 键值对对象 添加到map集合中,方法返回null
在添加元素的时候,如果键是存在的,那么会把 原来的键值对对象覆盖,把被覆盖的值进行返回
在这里插入图片描述

⭐移除元素

remove("元素");

在这里插入图片描述

⭐清空元素

clear();

在这里插入图片描述

⭐判断是否存在某个 键 / 值

在这里插入图片描述

⭐判断集合是否为空

在这里插入图片描述

⭐判断集合的长度

size();

在这里插入图片描述

🍔Map的遍历方式

⭐方法一:键找值

package com.practice;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class practicedemo {
    public static void main(String[] args) {
        Map<String,String>map=new HashMap<>();
        map.put("1","2");
        map.put("3","4");
        map.put("5","6");
        //通过键找值
            //获取所有的键,把这些键都放到一个单列集合中
        Set<String>keys=map.keySet();
        for(String key:keys){
            //利用map集合中的键获取对应的值 get
            String value=map.get(key);
            System.out.println(key+"="+value);
        }
    }
}

在这里插入图片描述

⭐方法二:键值对

package com.practice;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class practicedemo {
    public static void main(String[] args) {
        Map<String,String>map=new HashMap<>();
        map.put("1","2");
        map.put("3","4");
        map.put("5","6");
        //通过键值对
            //获取所有的键值对对象,返回一个Set集合
        Set<Map.Entry<String,String>> entries = map.entrySet();
            //遍历entries这个集合,去得到里面的每一个键值对对象
        for (Map.Entry<String,String>entry:entries){
            //通过entry调用get方法获取键和值
            String key=entry.getKey();
            String value=entry.getValue();
            System.out.println(key+"+"+value);
        }
    }
}

在这里插入图片描述

✨分析一下Map.Entry<String,String>

在这里插入图片描述
所以我们在表示Entry类型的时候,要使用Map(外部接口) . Entry去调用一下

⭐方法三:Lambda表达式

package com.practice;

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

public class practicedemo {
    public static void main(String[] args) {
        Map<String,String>map=new HashMap<>();
        map.put("1","2");
        map.put("3","4");
        map.put("5","6");
        //通过lambda表达式
        	//匿名内部类的方式
        map.forEach(new BiConsumer<String, String>() {
            @Override
            public void accept(String s, String s2) {
                System.out.println(s+"="+s2);
            }
        });

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

        map.forEach((String s, String s2) -> {
                System.out.println(s+"="+s2);
            }
        );

        System.out.println("----------------------------");
        
        map.forEach(( s, s2) -> System.out.println(s+"="+s2));
    }
}

在这里插入图片描述

✨分析一下new BiConsumer<String, String>()

为什么是new BiConsumer<String, String>()

我们来查看一下forEach的源码
在这里插入图片描述
继续查看BiConsumer的源码

在这里插入图片描述

Lambda表达式只能用于实现只有一个抽象方法的接口,因为BiConsumer是一个接口,所以可以使用Lambda表达式

🎄HashMap

🍔特点

  • HashMap是Map里面的一个实现类
  • 方法可以直接使用Map里面的方法
  • 特点都是由 键 决定的:无序,不重复,无索引

🍔例子

⭐注意

  • HashMap底层是哈希表结构的
  • 依赖hashCode方法和equals方法保证键的唯一
  • 如果存储的是自定义对象,需要重写hashCode和equals方法
  • 如果存储的是自定义对象,不需要重写hashCode和equals方法

Student.java

package com.itheima.a02myhashmap;

import java.util.Objects;

public class Student {
    private String name;
    private int age;


    public Student() {
    }

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

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    @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);
        return name.hashCode();
    }

    public String toString() {
        return "Student{name = " + name + ", age = " + age + "}";
    }
}

A01_HashMapDemo1.java

package com.itheima.a02myhashmap;

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

public class A01_HashMapDemo1 {
    public static void main(String[] args) {
       /*
        需求:创建一个HashMap集合,键是学生对象(Student),值是籍贯(String)。
        存储三个键值对元素,并遍历
        要求:同姓名,同年龄认为是同一个学生

        核心点:
            HashMap的键位置如果存储的是自定义对象,需要重写hashCode和equals方法。
       */


        //1.创建HashMap的对象
        HashMap<Student,String> hm = new HashMap<>();

        //2.创建三个学生对象
        Student s1 = new Student("zhangsan",23);
        Student s2 = new Student("lisi",24);
        Student s3 = new Student("wangwu",25);
        Student s4 = new Student("wangwu",25);

        //3.添加元素
        hm.put(s1,"江苏");
        hm.put(s2,"浙江");
        hm.put(s3,"福建");
        hm.put(s4,"山东");

        //4.遍历集合
        Set<Student> keys = hm.keySet();
        for (Student key : keys) {
            String value = hm.get(key);
            System.out.println(key + "=" + value);
        }

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

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

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

        hm.forEach((student, s)-> System.out.println(student + "=" +  s));

    }
}

在这里插入图片描述

🎄LinkHashMap

🍔特点

  • 由键决定:有序,不重复,无索引
  • 这里的有序是指保证存储和取出的元素顺序一致

在这里插入图片描述

🎄TreeMap

🍔特点

  • TreeMap和TreeSet底层原理一样,都是红黑树结构的
  • 由键决定特性:不重复,无索引,可排序
  • 可排序是可以对键进行排序,默认按照键从小到大排序,也可以自己定义键的排序规则

⭐两种排序规则

  • 实现Comparable接口,指定比较规则
  • 创建集合时传递Comparator比较器对象,指定比较规则

默认是升序排列
在这里插入图片描述
加上比较器后,可以变成降序排序

在这里插入图片描述

对比一下
HashMap效率高但是TreeMap可以排序,使用时要有所甄别

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

inBuilder低代码平台新特性推荐-第八期

今天来给大家带来的是inBuilder低代码平台特性推荐系列第八期——定时任务&#xff01; inBuilder计划任务框架支持快速开发&#xff0c;任务开发完成后&#xff0c;只需发布成bean&#xff0c;并通过配置界面绑定所需触发器&#xff0c;即可到点触发。 一、 概念介绍 定时任…

Java的IO流-打印流

打印流 PrintStream public void println&#xff08;&#xff09;自动换行 PrintWriter package com.itheima.println;import java.io.FileInputStream; import java.io.PrintStream; import java.io.PrintWriter;public class Test2 {public static void main(String[] arg…

HarmonyOS脚手架:快捷实现ArkTs中json转对象

前言 在上篇《HarmonyOS开发&#xff1a;UI开展前的阶段总结》中提到了未来的规划&#xff0c;既能让大家学会鸿蒙开发&#xff0c;也能让大家在以后的开发中如虎添翼&#xff0c;最终决定&#xff0c;便以脚手架为产出物&#xff0c;结合实际的业务需求&#xff0c;进行相关技…

读《Segment Anything in Defect Detection》

摘要 (好像只是说把SAM应用到了红外缺陷分割领域) 引言 无损检测得到红外图像&#xff0c;根据热能观察异常 贡献&#xff1a; •从两个光学脉冲热成像系统构建广泛的缺陷热数据库&#xff0c;包括各种材料并释放它们。 • 开发DefectSAM&#xff0c;这是第一个用于缺陷检测…

什么是美颜SDK?直播美颜SDK技术深度剖析

在实现实时美颜的过程中&#xff0c;美颜SDK扮演着关键的角色&#xff0c;它为开发者提供了一套强大的工具&#xff0c;使得实时美颜效果能够轻松应用于直播平台。 一、美颜SDK的基本概念 美颜SDK是一种软件工具包&#xff0c;通过集成了丰富的图像处理算法和实时计算技术&a…

香港身份和内地身份可以共存吗?

香港身份和内地身份可以共存吗&#xff1f; 很多朋友在刚开始了解香港身份的时候&#xff0c;都会对香港永居身份、居民身份、内地户口等等名词产生疑惑&#xff0c;搞不清它们之间的区别。 还有一部分人误以为拿到香港身份就意味着要放弃内地户口。 今天银河君就来具体解释…

java springboot在测试类中启动一个web环境

我们在开发过程中 可以对数据层 业务层做测试 那我们的表现层能做测试吗&#xff1f; 答案自然是可以的 但是 前提 我们要有一个web环境 我们现在 测试类运行 明显是个很普通的java程序 还是这个 SpringBootTest 它有一个 webEnvironment 我们可以先这样写 package com.examp…

大数据-之LibrA数据库系统告警处理(ALM-12057 元数据未配置周期备份到第三方服务器的任务)

告警解释 系统安装完成后会检查元数据是否有周期备份到第三方服务器的任务&#xff0c;然后每1小时会检查一次。如果元数据未配置周期备份到第三方服务器的任务&#xff0c;将发送严重告警。 在用户创建元数据周期备份到第三方服务器的任务后&#xff0c;告警消除。 告警属性…

单链表相关面试题--1.删除链表中等于给定值 val 的所有节点

/* 解题思路&#xff1a;从头节点开始进行元素删除&#xff0c;每删除一个元素&#xff0c;需要重新链接节点 */ struct ListNode* removeElements(struct ListNode* head, int val) {if(head NULL)return NULL;struct ListNode* cur head;struct ListNode* prev NULL;while…

打造自己的3D模型AI 自动纹理工具

在线工具推荐&#xff1a; 三维数字孪生场景工具 - GLTF/GLB在线编辑器 - Three.js AI自动纹理化开发 - YOLO 虚幻合成数据生成器 - 3D模型在线转换 - 3D模型预览图生成服务 为 3D 模型创建纹理可能比您想象的要容易。虽然注意细节很重要&#xff0c;但有很多方法可以制…

你好,我叫Python,欢迎你认识派森。(来自关于Python语言的全方位自我介绍。

文章目录 自我简介一、Python的发展历程二、Python的特色1.语言特色2.语法特色 三、Python2与Python3的比较1.print 函数2.Unicode3.除法运算4.异常5.八进制字面量表示6.不等运算符7.python 3.0严格使用tab键进行缩进 四、Python适用开发场景及成果1.应用领域2.Python开发出的应…

二百零六、Flume——Flume1.9.0单机版部署脚本(附截图)

一、目的 在实际项目部署时&#xff0c;要实现易部署易维护&#xff0c;需要把安装步骤变成安装脚本实现快速部署 二、部署脚本在Linux中文件位置 文件夹中只有脚本文件flume-install.sh和tar包apache-flume-1.9.0-bin.tar.gz 三、Flume安装脚本 #!/bin/bash #获取服务器名…

使用centos搭建内网的yum源

1.安装httpd服务 2.启动服务&#xff0c;设置开机自启 #启动服务 systemctl start httpd # 设置开机自动启动 systemctl enable httpd systemctl status httpd3.新建一个目录&#xff0c;将rpm文件放到该目录下 4.将/etc/httpd/conf/httpd.conf文件中的DocumentRoot "…

海康威视综合安防管理平台任意文件上传

系统介绍 HIKVISION iSecure Center综合安防管理平台是一套“集成化”、“智能化”的平台&#xff0c;通过接入视频监控、一卡通、停车场、报警检测等系统的设备&#xff0c;获取边缘节点数据&#xff0c;实现安防信息化集成与联动&#xff0c;公众号&#xff1a;web安全工具库…

【SpringCloud】Eureka基于Ribbon负载均衡的调用链路流程分析

文章目录 前言1.调用形式2.LoadBalancerInterceptor3.负载均衡流程分析3.1 调用流程图3.2 intercept&#xff08;&#xff09;方法3.3 execute&#xff08;&#xff09;方法3.4 getServer()方法3.4 子类的chooseServer&#xff08;&#xff09;方法3.5 getLoadBalancerStats().…

低代码平台全解析:衍生历程、优势呈现与未来趋势一览无余

在数字化时代&#xff0c;应用程序的开发与更新已成为企业保持竞争力的关键。传统的编码方式&#xff0c;虽然精细且功能强大&#xff0c;但耗时且要求开发者具备较高的技术水平。在这样的背景下&#xff0c;低代码开发平台的出现无疑为企业带来了福音。 低代码开发平台是一种创…

一文全面了解低代码

目录 一、低代码概况 二、低代码构成 三、低代码开发者 1&#xff09;低代码赋能IT技术人员--低代码 2&#xff09;低代码赋能业务人员--零代码 四、低代码核心技术概念 五、低代码能力 六、低代码技术应用价值及趋势 一、低代码概况 2014年&#xff0c;Forrester提出了低代码…

nvm的下载与使用

1.如果已经安装nodejs , 先卸载nodejs; 从控制面板中 卸载程序 卸载nodejs win r打开cmd ,管理员运行 where node 查看是否删除干净nodejs 2.下载nvm 从github 下载nvm , 下载nvm 3.nvm 和node安装路径最好写在同一个路径下 &#xff0c;如D盘 ,D\a\nvm , D\a\nodejs 4.…

采购组件修改申请办理流程

现有采购流程1 #mermaid-svg-qAesAhfW2IQBcef8 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-qAesAhfW2IQBcef8 .error-icon{fill:#552222;}#mermaid-svg-qAesAhfW2IQBcef8 .error-text{fill:#552222;stroke:#5522…

Linux:安装MySQL服务(非docker方式)

1、下载安装包 下载MySQL安装包&#xff0c;需要Oracle官网的账号 下面是网友提供的账号及密码&#xff0c;亲测有效。 账户&#xff1a;3028064308qq.com 我用的这个&#xff0c;可以登陆 密码&#xff1a;OraclePassword123!Oracle Account: 602205528qq.com Oracle Pass…