从零学Java Map集合

news2024/9/28 15:29:36

Java Map集合

文章目录

  • Java Map集合
    • 1 Map 结构
    • 2 Map 父接口
      • 2.1 Map接口的特点
      • 2.2 常用方法
    • 3 Map集合的实现类
      • 3.1 HashMap【重点】
      • 3.2 LinkedHashMap
      • 3.3 TreeMap
      • 3.4 Hashtable(了解)
      • 3.5 Properties 属性集合
    • 4 HashMap 源码分析

1 Map 结构

概念: 将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值

在这里插入图片描述

2 Map 父接口

2.1 Map接口的特点

  • 用于存储键值对(Key-Value)
  • 键不可以重复,值可以重复
  • 无序无下标

2.2 常用方法

eg:

package StageOne.day19;

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

/**
 * @author 胡昊龙
 * @version 1.0
 * @description: TODO
 * @date 2024/1/12 9:14
 * Map 接口:
 * 特点: 1 存储键值对 2 键不可以重复,值可以 3 无序无下标
 */
public class TestMap {
    public static void main(String[] args) {
        Map<String,String> map = new HashMap<>();
        //1 添加
        map.put("cn","中国");
        map.put("usa","美国");
        //key 相同, 值替换
        map.put("usa","美利坚合众国");
        map.put("uk","英国");
        System.out.println("元素个数: "+map.size());
        System.out.println("打印: "+map);
        //2 删除
        //map.remove("usa");
        //System.out.println("删除后: "+map);
        //map.clear();
        //3 遍历
        //3.1 使用keySet()方法,返回只有key的Set集合
        Set<String> keySet = map.keySet();
        for (String key : keySet) {
            System.out.println(key+"..."+map.get(key));
        }
        System.out.println("----------------------");
        //3.2 使用entrySet()方法,返回映射对(既有Key,也有Value)的Set集合
        //Map.Entry 公开静态内部接口
        Set<Map.Entry<String, String>> entries = map.entrySet();
        for (Map.Entry<String, String> entry : entries) {
            System.out.println(entry.getKey()+"..."+entry.getValue());
        }
        //4 判断
        System.out.println(map.containsKey("usa"));
        System.out.println(map.containsValue("美国"));
        System.out.println(map.isEmpty());
        //5 获取value集合
        Collection<String> values = map.values();
        for (String value : values) {
            System.out.println(value);
        }
    }
}

3 Map集合的实现类

3.1 HashMap【重点】

存储结构 : 哈希表,键重复依据hashCode和equals方法。

  • JDK1.2版本,线程不安全,运行效率快
  • 允许用null 作为key或是value。

存储过程 :

  1. 根据Key 的Hash值计算位置, 如果此位置没有元素直接加入
  2. 如果此位置有元素, 则再比较Key 的equals()方法, 如果为true, 则拒绝加入, 如果为false形成来链表

eg:

package StageOne.day19;

import java.util.*;

/**
 * @author 胡昊龙
 * @version 1.0
 * @description: TODO
 * @date 2024/1/12 9:49
 */
public class TestHashMap {
    static class Student {
        String name;
        int age;

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

        @Override
        public String toString() {
            return "Student{" +
                    "name='" + name + '\'' +
                    ", 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);
        }
    }

    public static void main(String[] args) {
        HashMap<Student,String> hashMap = new HashMap<>();
        //1 添加
        Student s1 = new Student("小明", 18);
        Student s2 = new Student("小红", 16);
        Student s3 = new Student("小白", 20);
        //重写equals()方法和hashCode()方法
        Student s4 = new Student("小明", 18);
        hashMap.put(s1,"北京昌平");
        hashMap.put(s2,"上海浦东");
        hashMap.put(s3,"叙利亚");
        hashMap.put(s4,"乌克兰");
        System.out.println("元素个数: "+hashMap.size());
        System.out.println("打印: "+hashMap);
        //2 删除
        //hashMap.remove(s2);
        //System.out.println("删除后: "+hashMap);
        //hashMap.clear();
        //3 遍历
        //3.1 使用keySet()方法,返回只有key的Set集合
        Set<Student> keySet = hashMap.keySet();
        for (Student key : keySet) {
            System.out.println(key+"..."+hashMap.get(key));
        }
        System.out.println("----------------------");
        //3.2 使用entrySet()方法,返回映射对(既有Key,也有Value)的Set集合
        //Map.Entry 公开静态内部接口
        Set<Map.Entry<Student, String>> entries = hashMap.entrySet();
        for (Map.Entry<Student, String> entry : entries) {
            System.out.println(entry.getKey()+"..."+entry.getValue());
        }
        //4 判断
        System.out.println(hashMap.containsKey(s1));
        System.out.println(hashMap.containsValue("叙利亚"));
        System.out.println(hashMap.isEmpty());
        //5 获取value集合
        Collection<String> values = hashMap.values();
        for (String value : values) {
            System.out.println(value);
        }
    }
}

3.2 LinkedHashMap

存储结构 : 双向链表保存HashMap的顺序,有顺序的HashMap

3.3 TreeMap

存储结构 : 红黑树,重复依据排序实现。

  • 可以对key自动排序,Key需实现Comparable接口。或使用Comparator定制比较器

eg:

1 实现Comparable接口

@Override
public int compareTo(Student o) {
    int n1 = this.age-o.age;
    int n2 = this.name.compareTo(o.name);
    return n1==0?n2:n1;
}

2 定制Comparator比较器

//比较器
Comparator<Student> cmp = new Comparator<Student>() {
    @Override
    public int compare(Student o1, Student o2) {
        int n1 = o1.name.compareTo(o2.name);
        int n2 = o1.age-o2.age;
        return n1==0?n2:n1;
    }
};

eg:

package StageOne.day19;

import java.util.*;

/**
 * @author 胡昊龙
 * @version 1.0
 * @description: TODO
 * @date 2024/1/12 10:21
 */
public class TestTreeMap {
    static class Student implements Comparable<Student>{
        String name;
        int age;

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

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

        @Override
        public int compareTo(Student o) {
            int n1 = this.age-o.age;
            int n2 = this.name.compareTo(o.name);
            return n1==0?n2:n1;
        }
    }

    public static void main(String[] args) {
        //比较器
        Comparator<Student> cmp = new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                int n1 = o1.name.compareTo(o2.name);
                int n2 = o1.age-o2.age;
                return n1==0?n2:n1;
            }
        };
        TreeMap<Student,String> treeMap = new TreeMap<>();
        //1 添加
        Student s1 = new Student("zzz", 18);
        Student s2 = new Student("fff", 20);
        Student s3 = new Student("aaa", 12);
        Student s4 = new Student("aaa", 12);
        treeMap.put(s1,"北极");
        treeMap.put(s2,"北京");
        treeMap.put(s3,"上海");
        System.out.println("元素个数: "+treeMap.size());
        System.out.println("打印: "+treeMap);
        //2 删除
        //treeMap.remove(s2);
        //System.out.println("删除后: "+treeMap);
        //treeMap.clear();
        //3 遍历
        //3.1 使用keySet()方法,返回只有key的Set集合
        Set<Student> keySet = treeMap.keySet();
        for (Student key : keySet) {
            System.out.println(key+"..."+treeMap.get(key));
        }
        System.out.println("----------------------");
        //3.2 使用entrySet()方法,返回映射对(既有Key,也有Value)的Set集合
        //Map.Entry 公开静态内部接口
        Set<Map.Entry<Student, String>> entries = treeMap.entrySet();
        for (Map.Entry<Student, String> entry : entries) {
            System.out.println(entry.getKey()+"..."+entry.getValue());
        }
        //4 判断
        System.out.println(treeMap.containsKey(s1));
        System.out.println(treeMap.containsValue("叙利亚"));
        System.out.println(treeMap.isEmpty());
        //5 获取value集合
        Collection<String> values = treeMap.values();
        for (String value : values) {
            System.out.println(value);
        }
    }
}

3.4 Hashtable(了解)

  • JDK1.0版本,线程安全,运行效率慢;不允许null作为key或是value。

3.5 Properties 属性集合

  • Hashtable的子类。

特点

  • 存储属性名和属性值。
  • key和value都是String,通常用于读取配置文件。
  • 没有泛型。
  • 和IO流有关系。

eg:

package StageOne.day19;

import java.util.Collection;
import java.util.Properties;
import java.util.Set;

/**
 * @author 胡昊龙
 * @version 1.0
 * @description: TODO
 * @date 2024/1/12 10:55
 * 特点:
 * 1 存储属性名和属性值
 * 2 属性名和属性值都是String类型
 * 3 没有泛型
 * 4 和IO流有关
 */
public class TestProperties {
    public static void main(String[] args) {
        //创建集合
        Properties properties = new Properties();
        //1 添加
        properties.setProperty("username","小明");
        properties.setProperty("age","20");
        properties.setProperty("gender","男");
        System.out.println("元素个数: "+properties.size());
        System.out.println("打印: "+properties);
        //2 删除
        //properties.remove("gender");
        //properties.clear();
        //3 遍历
        Set<String> strings = properties.stringPropertyNames();
        for (String key : strings) {
            System.out.println(key+"..."+properties.getProperty(key));
        }
        //4 判断
        System.out.println(properties.containsKey("username"));
        System.out.println(properties.containsValue("男"));
        //5 获取value
        Collection<Object> values = properties.values();
        for (Object value : values) {
            System.out.println(value);
        }
    }
}

4 HashMap 源码分析

  • 无参构造创建HashMap时,加载因子0.75,table是null,为了节省空间,当添加第一个元素时,table容量调整为16。
  • 当元素个数大于阈值(16*0.75=12)时,会进行扩容,扩容后大小为原来的2倍。目的是减少调整元素位置的个数。
  • jdk1.8 当每个链表长度大于8,并且数组元素个数大于等于64时,会调整为红黑树,目的提高执行效率。
  • jdk1.8 当红黑树节点个数小于等于6时,调整成链表。、
  • jdk1.8以前,链表是头插入,jdk1.8以后是尾插入。

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

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

相关文章

react输入框检索树形(tree)结构

input搜索框搜索树形子级内容1. input框输入搜索内容2. 获取tree结构数据3. 与tree匹配输入的内容&#xff0c;tree是多维数组&#xff0c;一级一级的对比输入的内容是否匹配&#xff0c;用forEach循环遍历数据&#xff0c;匹配不到在往下找&#xff0c;直到找到为null &#x…

2024年甘肃省职业院校技能大赛信息安全管理与评估 样题二 模块二

竞赛需要完成三个阶段的任务&#xff0c;分别完成三个模块&#xff0c;总分共计 1000分。三个模块内容和分值分别是&#xff1a; 1.第一阶段&#xff1a;模块一 网络平台搭建与设备安全防护&#xff08;180 分钟&#xff0c;300 分&#xff09;。 2.第二阶段&#xff1a;模块二…

数据结构排序——详细讲解归并排序(c语言实现递归及非递归)

上次是快排和冒泡&#xff1a;数据结构排序——详解快排及其优化和冒泡排序(c语言实现、附有图片与动图示意&#xff09; 今天为大家带来归并排序 文章目录 1.基本思想2.递归实现3.非递归实现 1.基本思想 归并排序是一种分治算法&#xff0c;它将序列分成两个子序列&#xff0…

Docker与微服务实战(高级篇)- 【上】

Docker与微服务实战&#xff08;高级篇&#xff09;- 【上】 一、Docker复杂安装详说1.1 Mysql主从复制--原理-【尚硅谷Mysql高级篇】1.2 Mysql主从复制--【一主一从】搭建步骤1.2.1新建--【主服务器】--容器实例--33071.2.2.进入/app/mysql-master/conf目录下新建my.cnf1.2.3.…

3d建模软件有哪些?3d云渲染推荐

3D建模软件有很多&#xff0c;有的非常复杂难以上手&#xff0c;那么适合新手的有哪些呢&#xff1f;一起来看看吧。 1、SketchUp SketchUp是一个用户友好且直观的建模软件&#xff0c;能与V-Ray渲染器一起使用&#xff0c;适合初学者。2、Blender Blender是一个功能强大且免费…

超声波清洗机可以洗些什么东西?质量比较好的超声波清洗机推荐

超声波清洗机只能清洗眼镜吗&#xff1f;不是的&#xff01;超声波清洗机能够清洗的物品远比我们想象的还多&#xff0c;最常见的还是清洗眼镜&#xff0c;毕竟超声波清洗机最常见就是在眼镜店了&#xff0c;很多朋友都喜欢定期都眼镜店里来清洗一下眼镜&#xff0c;这个习惯其…

录屏怎么打开?看这里,录制视频不费事!

随着科技的快速发展&#xff0c;录屏已经成为人们日常生活中经常使用的功能。无论是录制游戏视频、教程讲解&#xff0c;还是录制在线会议&#xff0c;录屏软件都发挥着重要作用。然而&#xff0c;很多用户并不知道录屏怎么打开&#xff0c;以及如何使用它们。本文将介绍两种常…

爬虫实战丨基于requests爬取比特币信息并绘制价格走势图

文章目录 写在前面实验环境实验描述实验内容 写在后面 写在前面 本期内容&#xff1a;基于requests爬取比特币信息并绘制价格走势图 下载地址&#xff1a;https://download.csdn.net/download/m0_68111267/88734451 实验环境 anaconda丨pycharmpython3.11.4requests 安装r…

多级缓存架构(三)OpenResty Lua缓存

文章目录 一、nginx服务二、OpenResty服务1. 服务块定义2. 配置修改3. Lua程序编写4. 总结 三、运行四、测试五、高可用集群1. openresty2. tomcat 通过本文章&#xff0c;可以完成多级缓存架构中的Lua缓存。 一、nginx服务 在docker/docker-compose.yml中添加nginx服务块。…

canvasdrawer 微信原生小程序生成海报图片

在小程序中生成海报是一种非常有效的推广方式 用户可以使用小程序的过程中生成小程序海报并分享给他人 通过海报的形式&#xff0c;用户可以直观地了解产品或服务的特点和优势 常见绘制海报方式 目前&#xff0c;小程序海报有两种常见的实现方式&#xff1a; canvas 绘制…

Python基础语法汇总【保姆级小白教程】

文章目录 一&#xff1a;Python基础概念1.认识Python&#xff1a;2.Python的优势&#xff1a;3.Python的应用领域&#xff1a;4.Python的执行方式&#xff1a;5.文档&#xff1a; 二&#xff1a;变量与数据类型1.变量&#xff1a;2.id()函数&#xff1a;3.注释&#xff1a;4.基…

SqlAlchemy使用教程(一) 原理与环境搭建

一、SqlAlchemy 原理及环境搭建 SqlAlchemy是1个支持连接各种不同数据库的Python库&#xff0c;提供DBAPI与ORM&#xff08;object relation mapper&#xff09;两种方式使用数据库。 DBAPI方式&#xff0c;即使用SQL方式访问数据库 ORM, 对象关系模型&#xff0c;是用 Python…

竞赛保研 基于深度学习的视频多目标跟踪实现

文章目录 1 前言2 先上成果3 多目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的视频多目标跟踪实现 …

Trans论文复现:基于数据驱动的新能源充电站两阶段规划方法程序代码!

适用平台&#xff1a;MatlabYalmipCplex/Gurobi&#xff1b; 文章提出了一种电动汽车充电站的两阶段规划方法&#xff0c;第一阶段通过蒙特卡洛法模拟充电车辆需求和电池充放电数据来确定充电站位置&#xff1b;第二阶段通过数据驱动的分布鲁棒优化方法优化充电站的新能源和电池…

Jenkins配置发邮件

Jenkins配置发邮件 账号设置 首先这个邮箱账号要支持发邮件&#xff0c;QQ邮箱开通SMTP即可之后要认证 企业微信邮箱 开启IMAP/SMTP服务开启POP/SMTP服务 无论是企业微信邮箱还是QQ邮箱都是SSL协议&#xff0c;在下面的配置中我都会勾选上&#xff01;&#xff01;&#xff0…

Nginx配置jks格式证书,升级https

通常在给服务器升级https&#xff0c;需要在nginx上配置域名对应的https证书&#xff0c;nginx通常配置的是crt和key格式的证书。最近遇到有人提供了jks格式的证书&#xff0c;查阅了几个资料都是需要先将jks转为p12格式&#xff0c;然后再将p12转为crt格式。这里记录一下相关过…

【自控实验】3. 带有饱和非线性环节控制系统相平面分析

本科课程实验报告&#xff0c;有太多公式和图片了&#xff0c;干脆直接转成图片了 仅分享和记录&#xff0c;不保证全对 实验内容&#xff1a; 有无非线性环节的相轨迹对比&#xff0c;并求超调量。 在输入单位阶跃信号Xsr时&#xff0c;用示波器观察和记录系统输入饱和非线…

复选框QCheckBox和分组框QGroupBox

1. 复选框&#xff1a;QCheckBox 实例化 //实例化 // QCheckBox* checkBox new QCheckBox("是否同意该条款",this);QCheckBox* checkBox new QCheckBox(this);1.1 代码实现 1.1.1 复选框的基本函数 复选框选中状态的参数 Qt::Unchecked //未选中状态 Qt::Part…

Java字符串拼接常用方法总结

使用场景&#xff1a;用某个分隔符拼接字符串 下边是我使用过的几种方式废话不多说&#xff0c;直接上代码初始数据 1.使用流2.StringBuilder3.[StringJoiner](https://blog.csdn.net/qq_43417581/article/details/126076152?ops_request_misc%257B%2522request%255Fid%2522%2…

win11下载Hbuliderx 安装闪退解决教程+安装包分享

在官网下载 目录 在官网下载 出现闪退 下载失败 2.2. 最终在百度网盘里下载了历史版本 2.3. 然后解压文件 2.4. 双击打开 2.5. 安装成功 出现闪退 下载失败 结果下载失败&#xff0c;一下子弹出的下载框就会闪退 2.2. 最终在百度网盘里下载了历史版本 下载的网盘链接: …