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地址和端口号。 端口号是传输层协议中最显著的特征,传输层根据它来确定上层绑定的应用程序,以达到把数据交给上层应用处理的目的。…

Elementary OS 7.1简单桌面调整

Elementary OS的Pantheon桌面环境提供了一种非常独特和直观的用户体验。默认情况下&#xff0c;Pantheon桌面并没有提供传统的窗口最小化、最大化按钮。但是可以通过安装和使用特定的工具来调整和自定义这些设置。 可以通过以下步骤来启用窗口的最小化和最大化按钮&#xff1a…

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

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

Docker面试整理-什么是Docker Hub?

Docker Hub 是一个由 Docker, Inc. 维护的公共镜像注册服务,它允许用户分享、存储和管理 Docker 镜像。Docker Hub 提供了一个中心化的资源库,用户可以从中拉取(下载)和推送(上传)镜像,这使得它成为分享和分发容器应用的重要平台。 Docker Hub 的主要功能包括: 镜像存储…

在 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…

Python中Web表单和用户输入的处理

在现代Web应用程序中&#xff0c;处理用户输入和表单提交是必不可少的部分。在Python中&#xff0c;使用Flask框架可以非常方便地处理这些操作。本文将详细介绍如何在Flask中处理Web表单和用户输入&#xff0c;包括基本的表单创建、验证、提交和处理等方面。通过这些内容&#…

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

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

#05 深入Stable Diffusion的参数调整和优化技巧

文章目录 前言1. 理解关键参数2. 参数调整策略2.1 学习率调整2.2 批量大小优化2.3 迭代次数设置2.4 潜在空间维度选择 3. 优化技巧3.1 使用预训练模型3.2 数据增强3.3 模型微调 4. 实践建议结论 前言 Stable Diffusion作为一款强大的AI图像生成工具&#xff0c;其性能的优劣很…

centos如何压缩zip

在CentOS中&#xff0c;您可以使用zip命令来压缩文件或文件夹为ZIP格式。如果zip命令尚未安装&#xff0c;您可以通过执行以下命令来安装它&#xff1a; sudo yum install zip unzip压缩单个文件的基本命令格式为&#xff1a; zip [压缩后的文件名].zip [文件名]压缩一个文件…

rpm安装

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

什么是函数?在C语言中如何定义一个函数

函数是编程中用于执行特定任务的一组指令的集合。它有一个名称&#xff08;即函数名&#xff09;&#xff0c;可以通过该名称在程序中多次调用该函数以执行相同的任务。这有助于提高代码的可重用性和可维护性。 在C语言中&#xff0c;函数的定义通常包括以下几个部分&#xff…

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

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

UIScrollView的相关笔记

1. 当UIScrollview横向滚动时&#xff0c;如果在上面添加5个按钮&#xff0c;但当前scrollview 一页只能显示3个按钮&#xff0c;此时有一项要求&#xff0c;需要在点击第3个按钮时&#xff0c;scrollview自动向左滑动&#xff0c;显示后面的按钮等&#xff0c;需要在按钮点击方…

SpringMVC:Quartz常见问题

一、配置job的xml里<start-time>的时间格式 从源码JobSchedulingDataProcessor类中可以看出&#xff1a;格式例如&#xff08;2012-03-31T05:55:00&#xff09; /*** XML Schema dateTime datatype format.* <p>* See <a href"http://www.w3.org/TR/2001/…

学习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;算法专题 ⏰诗词歌…