java中的双列集合(Map,HashMap,TreeMap,LinkedHashMap)

双列集合的特点

双列集合一次需要存一对数据,分别为键和值
键不能重复,值可以重复
键和值是一一对应的,每一个键只能找到自己对应的值
键+值这个整体 ,我们称之为“键值对”或者“键值对对象”,在Java中叫做“Entry对象”

Map的常见API

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

V put(K key,v value)                添加元素

V remove(object key)                根据键删除键值对元素

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

boolean containsKey(object key)                判断集合是否包含指定的键

boolean containsValue(object value)        判断集合是否包含指定的值

boolean isEmpty()                判断集合是否为空

int size()                集合的长度,也就是集合中键值对的个数 

put 添加元素

那么这个返回值是什么呢?我们来试试看添加第二个"张三"

可以看到返回的是18,是"张三"之前对应的值,再来看看👇

还没有添加第二个”张三“的时候,返回的是null

总结:

在添加数据的时候,如果键不存在,那么直接把键值对对象添加到map集合当中,方法返回null

在添加数据的时候,如果键是存在的,那么会把原有的键值对对象覆盖,会把被覆盖的值进行返回。 

V remove(object key)                根据键删除键值对元素

可以看到返回的是删除键所对应的值

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

清空了

boolean containsKey(object key)                判断集合是否包含指定的键

boolean containsValue(object value)        判断集合是否包含指定的值

boolean isEmpty()                判断集合是否为空

如果我给数据清空了,就是👇这样

 

int size()                集合的长度,也就是集合中键值对的个数 

 

Map的遍历方式 

键找值 

装着健的单列集合使用增强for形式进行遍历

装着健的单列集合使用迭代器形式进行遍历

装着健的单列集合使用lambda表达式形式进行遍历 

键值对

装着健值对的单列集合使用增强for形式进行遍历 

装着健值对的单列集合使用迭代器形式进行遍历

装着健值对的单列集合使用lambda表达式形式进行遍历

lambda表达式 

HashMap的特点

  1. HashMap是Map里面的一个实现类,
  2. 没有额外需要学习的特有方法,直接使用Map里面的方法就可以了
  3. 特点都是由键决定的:无序、不重复、无索引
  4. HashMap跟Hashset底层原理是一模一样的,都是哈希表结构

HashMap底层是哈希表结构的

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

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

如果值存储自定义对象,不需要重写hashcode和equals方法 

练习 

1、创建一个HashMap集合,键是学生对象(Student),值是籍贯(String)。
存储三个键值对元素,并遍历
要求:同姓名,同年龄认为是同一个学生

HashMap的键位置如果存储的是自定义对象,需要重写hashcode和equals方法。

先写Student类

package Map;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;}@Overridepublic 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);}@Overridepublic int hashCode() {return Objects.hash(name, age);}public String toString() {return "Student{name = " + name + ", age = " + age + "}";}
}
import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class MapTest1 {public static void main(String[] args) {/*创建一个HashMap集合,键是学生对象(Student),值是住址(String)。存储三个键值对元素,并遍历要求:同姓名,同年龄认为是同一个学生*/HashMap<Student,String>hm=new HashMap<>();Student s1=new Student("张三",18);Student s2=new Student("李四",20);Student s3=new Student("王五",25);hm.put(s1,"北京");hm.put(s2,"南京");hm.put(s3,"上海");//遍历集合//第一种方法键找值Set<Student> keys = hm.keySet();for (Student key : keys) {System.out.println(key+"="+hm.get(key));}System.out.println("--------------------------------------");//第二种方法键值对Set<Map.Entry<Student, String>> entries = hm.entrySet();for (Map.Entry<Student, String> entry : entries) {System.out.println(entry.getKey()+"="+entry.getValue());}System.out.println("--------------------------------------");//第三种方法lambda表达式hm.forEach((student, s) ->System.out.println(student+"="+s));}
}

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

package Map;import java.util.*;public class MapTest2 {public static void main(String[] args) {String[] arr={"A","B","C","D"};Random r=new Random();ArrayList<String>list=new ArrayList<>();//将for (int i = 0; i < 80; i++) {int index = r.nextInt(arr.length);list.add(arr[index]);}HashMap<String,Integer>hm=new HashMap<>();for (String s : list) {if(hm.containsKey(s)){//存在Integer count = hm.get(s);count++;hm.put(s,count);}else{//不存在hm.put(s,1);}}System.out.println(hm);//求最大值Set<Map.Entry<String, Integer>> entries = hm.entrySet();int max=0;for (Map.Entry<String, Integer> entry : entries) {if (entry.getValue()>max) {max=entry.getValue();}}//确定哪个景点的次数与最大值一样for (Map.Entry<String, Integer> entry : entries) {if (entry.getValue()==max) {System.out.println(entry.getKey());}}}
}

LinkedHashMap 

由键决定:序、不重复、无索引

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

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

 与hashmap一样键也是唯一的

这里我给存储的顺序打乱了👇

可以看到存取顺序一致

TreeMap

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

键决定特性:不重复、无索引、可排序

可排序:对键进行排序。

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

代码书写两种排序规则

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

练习 

1、键;整数表示id  值:字符串表示商品名称     要求:按照id的升序排列、按照id的降序排列

id的升序排列👇

package Map;import java.util.Comparator;
import java.util.TreeMap;public class TreeMapTest1 {public static void main(String[] args) {/* 键;整数表示id值:字符串表示商品名称要求:按照id的升序排列、按照id的降序排列*/TreeMap<Integer,String>tm=new TreeMap<>(new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o2-o1;}});tm.put(1,"张三");tm.put(3,"王五");tm.put(2,"李四");System.out.println(tm);}
}

id的降序排列👇

o1:当前要添加的元素

o2:表示已经在红黑树中存在的元素

2、键:学生对象   值:籍贯    要求:按照学生年龄的升序排列,年龄一样按照姓名的字母排列,同姓名年龄视为同一个人

Student类

package Map;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;}/*** 获取* @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;}@Overridepublic 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);}@Overridepublic int hashCode() {return Objects.hash(name, age);}public String toString() {return "Student{name = " + name + ", age = " + age + "}";}@Overridepublic int compareTo(Student o) {//this:表示当前要添加的元素// o:表示已经在红黑树中存在的元素/*返回值:负数:表示当前要添加的元素是小的,存左边正数:表示当前要添加的元素是大的,存右边0:表示当前要添加的元素已经存在,舍弃*/int i=this.getAge()-o.getAge();i = i == 0 ? this.getName().compareTo(o.getName()) : i;return i;}
}

测试类

package Map;import java.util.TreeMap;public class TreeMapTest2 {public static void main(String[] args) {/*键:学生对象值:籍贯要求:按照学生年龄的升序排列,年龄一样按照姓名的字母排列,同姓名年龄视为同一个人*/TreeMap<Student,String>tm=new TreeMap<>();Student s1=new Student("张三",18);Student s3=new Student("王五",22);Student s2=new Student("李四",20);tm.put(s1,"北京");tm.put(s2,"南京");tm.put(s3,"上海");System.out.println(tm);}
}

 

3、字符串:"aababcabcdabcde”请统计字符串中每一个字符出现的次数,并按照以下格式输出输出结果:a(5)b(4)c(3)d(2)e(1)

 

package Map;import java.util.TreeMap;
import java.util.function.BiConsumer;public class TreeMapTest3 {public static void main(String[] args) {/*字符串:"aababcabcdabcde"请统计字符串中每一个字符出现的次数,并按照以下格式输出输出结果:a(5)b(4)c(3)d(2)e(1)*/String str="aababcabcdabcde";TreeMap<Character,Integer>tm=new TreeMap<>();for (int i = 0; i < str.length(); i++) {char c = str.charAt(i);if(tm.containsKey(c)){//存在int count=tm.get(c);count++;tm.put(c,count);}else{//不存在tm.put(c,1);}}//遍历集合,并按照指定的格式进行拼接StringBuilder sb = new StringBuilder();tm.forEach(new BiConsumer<Character, Integer>() {@Overridepublic void accept(Character key, Integer value) {sb.append(key).append("(").append(value).append(")");}});System.out.println(sb);}
}


这一期就到这里啦!!!感谢观看!!!

努力遇见更好的自己!!!

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

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

相关文章

CAPL如何发送一条UDP报文

UDP作为传输层协议,本身并不具有可靠性传输特点,所以不需要建立连接通道,可以直接发送数据。当然,前提是需要知道对方的通信端点,也就是IP地址和端口号。 端口号是传输层协议中最显著的特征,传输层根据它来确定上层绑定的应用程序,以达到把数据交给上层应用处理的目的。…

【Pytorch】计算机视觉项目——卷积神经网络TinyVGG模型图像分类(模型预测)

介绍 这篇文章是《【Pytorch】计算机视觉项目——卷积神经网络TinyVGG模型图像分类&#xff08;如何使用自定义数据集&#xff09;》的最后一部分内容&#xff1a;模型预测。 在本文中&#xff0c;我们将介绍如何测试模型的预测效果——让已训练好模型对一张新的图片进行分类&a…

在 SEO 中,一个好的网页必须具备哪些 HTML 标签和属性?

搜索引擎优化 &#xff08;SEO&#xff09; 是涉及提高网站在搜索引擎上的可见性的过程。这是通过提高网站在搜索引擎结果页面&#xff08;例如Google&#xff09;上的排名来实现的。网站在这些页面上的显示位置越高&#xff0c;就越有可能获得更大的流量。 搜索引擎优化涉及了…

跑mask2former(自用)

1. 运行docker 基本命令&#xff1a; sudo docker ps -a &#xff08;列出所有容器状态&#xff09; sudo docker run -dit -v /hdd/lyh/mask2former:/mask --gpus "device0,1" --shm-size 16G --name mask 11.1:v6 &#xff08;创建docker容器&…

Mac系统使用COLMAP

安装教程 如有出入&#xff0c;参照官网手册最新版 Installation — COLMAP 3.9-dev documentation 首先确保mac上安装了Homebrew 1.安装依赖项 brew install \cmake \ninja \boost \eigen \flann \freeimage \metis \glog \googletest \ceres-solver \qt5 \glew \cgal \s…

万里长城第一步——尚庭公寓【技术概述】

简略版&#xff1a; 项目概述主要是移动端&#xff08;房源检索&#xff1b;预约看房&#xff0c;租赁管理&#xff0c;浏览历史&#xff09;和后台管理&#xff08;管理员对房源进行操作&#xff09;&#xff1b; 项目使用前后端分离的方法&#xff0c;主要以后端为主&#xf…

rpm安装

rpm安装 命令格式&#xff1a; rpm 【选项】 文件名 选项&#xff1a; -i&#xff1a;安装软件 -v:显示安装过程信息 -h:用#表示安装进度&#xff0c;一个#代表2% -ivh&#xff1a;安装软件&#xff0c;显示安装过程 -e:卸载软件 -q:查看软件是否安装 -ql&#xff1…

信息系统项目管理师0147:工具与技术(9项目范围管理—9.3规划范围管理—9.3.2工具与技术)

点击查看专栏目录 文章目录 9.3.2 工具与技术 9.3.2 工具与技术 专家判断 规划范围管理过程中&#xff0c;应征求具备如下领域相关专业知识或接受过相关培训的个人或小组 的意见&#xff0c;涉及的领域包括&#xff1a;以往类似项目&#xff1b;特定行业、学科和应用领域的信息…

学习anjuke的过程

一、抓包 先看看12.25.1版本的APP是不是还能使用&#xff0c;如果还能使用我们就先破解低版本的。打开APP后发现还能正常使用&#xff0c;因为低版本的难度低我们就破解这个版本。低版本和高版本的算法是一样的&#xff0c;算法破解之后我们后续抓包替换接口就行了。手机安装上…

SQLAlchemy 模型中数据的错误表示

1. 问题背景 在使用 SQLAlchemy 0.6.0 版本&#xff08;也曾尝试使用 0.6.4 版本&#xff09;的 Pylons 应用程序中遇到了一个 SQLAlchemy ORM 问题。该问题出现在使用 psycopg2 作为数据库驱动程序、连接至 Postgresql 8.2 数据库的环境中。定义了一个 User 模型对象&#xf…

FreeRTOS基础(十一):消息队列

本文将详细全方位的讲解FreeRTOS的消息队列&#xff0c;其实在FreeRTOS中消息队列的重要性也不言而喻&#xff0c;与FreeRTOS任务调度同等重要&#xff0c;因为后面的各种信号量基本都是基于消息队列的。 目录 一、消息队列的简介 1.1 产生的原因 1.2 消息队列的解决办法 …

【数据库】SQL零基础入门学习

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

重邮计算机网络803-(2)物理层

一.物理层 1.介绍 物理层的主要任务描述为确定与传输媒体的接口的一些特性&#xff0c;即&#xff1a; ①机械特性 指明接口所用接线器的形状和尺寸、引线数目和排列、固定和锁定装置等等。 ②电气特性 指明在接口电缆的各条线上出现的电压的范围。 ③功能特性 指明某条线上…

B=2W,奈奎斯特极限定理详解

一直没搞明白奈奎斯特极限定理的含义&#xff0c;网上搜了很久也没得到答案。最近深思几天后&#xff0c;终于有了点心得。顺便吐槽一下&#xff0c;csdn的提问栏目&#xff0c;有很多人用chatgpt秒回这个事&#xff0c;实在是解决不了问题&#xff0c;有时候人的问题大多数都是…

HDFS 之 DataNode 核心知识点

优质博文&#xff1a;IT-BLOG-CN 一、DataNode工作机制 DataNode工作机制&#xff0c;如下所示&#xff1a; 【1】一个数据块在 DataNode上以文件形式存储在磁盘上&#xff0c;包括两个文件&#xff0c;一个是数据本身&#xff0c;一个是元数据包括数据块的长度&#xff0c…

前端 JS 经典:图片裁剪上传原理

前言&#xff1a;图片裁剪一般都是用户选择头像时用到&#xff0c;现在很多插件都可以满足这个功能&#xff0c;但是我们不仅要会用插件&#xff0c;还要自己懂的裁剪原理。 1. 流程 流程分为&#xff1a;1. 预览本地图片 2. 选择裁剪区域 3. 上传裁剪图像 2. 如何预览图片 …

小熊家务帮day10-day12 门户管理(缓存,主页,定时任务)

门户管理 1 门户介绍1.1 介绍1.2 常用技术方案 2 缓存技术方案2.1 需求分析2.1.1 C端用户界面原型2.1.2 缓存需求2.1.3 使用的工具 2.2 项目基础使用2.2.1 项目集成SpringCache2.2.2 测试Cacheable需求Service测试 2.1.3 缓存管理器&#xff08;设置过期时间&#xff09;2.1.4 …

计算机毕业设计PySpark+Hadoop地震预测系统 地震数据分析可视化 地震爬虫 大数据毕业设计 Flink Hadoop 深度学习

基于Hadoop的地震预测的 分析与可视化研究 姓 名&#xff1a;____田伟情_________ 系 别&#xff1a;____信息技术学院___ 专 业&#xff1a;数据科学与大数据技术 学 号&#xff1a;__2011103094________ 指导教师&#xff1a;_____王双喜________ 年 月 日 …

sqli-labs 靶场 less-5、6 第五关和第六关:判断注入点、使用错误函数注入爆库名、updatexml()函数

SQLi-Labs是一个用于学习和练习SQL注入漏洞的开源应用程序。通过它&#xff0c;我们可以学习如何识别和利用不同类型的SQL注入漏洞&#xff0c;并了解如何修复和防范这些漏洞。Less 5 SQLI DUMB SERIES-5 判断注入点&#xff1a;1. 首先&#xff0c;尝试正常的回显内容&#x…

Hadoop3:MapReduce源码解读之Map阶段的TextInputFormat切片机制(3)

Job那块的断点代码截图省略&#xff0c;直接进入切片逻辑 参考&#xff1a;Hadoop3&#xff1a;MapReduce源码解读之Map阶段的Job任务提交流程&#xff08;1&#xff09; 5、TextInputFormat源码解析 类的继承关系 它的内容比较少 重写了两个父类的方法 这里关心一下泛型参数…