Map接口以及Collections工具类
文章目录
- 1.Map接口概述
- 1.1 Map的实现类的结构
- 1.2 Map中存储的key-value结构的理解
- 1.3 HashMap的底层实现原理(以JDK7为例)
- 1.4 Map接口的常用方法
- 1.5 TreeMap
- 1.6 Map实现类之五: Properties
- 1.Collections工具类
- 1.1方法
- 1.1.1 排序操作(均为static方法)
- 1.1.2 查找、替换
1.Map接口概述
1.1 Map的实现类的结构
/---Map:双列数据,存储key-value对的数据,类似于高中的函数:y=f(x)/---HashMap:作为Map的主要实现类;线程不安全的,效率高;可以存储null的key和value/----LinkedHashMap:保证在遍历map元素时,可以按照添加的顺序实现遍历对于频繁的遍历操作,此类执行效率高于HashMap因为在原有的HashMap底层结构基础上,添加了一对指针,指向前一个和后一个元素,/----TreeMap:可以按照添加的key-value对进行排序,实现排序遍历,此时是按照key进行自然排序和定制排序,底层使用的红黑树/----Hashtable:作为Map的古老实现类,线程安全的,效率低;不能存储null的key和value/----Properties:常用来处理配置文件。key和value都是String类型HashMap的底层:数组+链表(jdk7及之前)数组+链表+红黑树(jdk8及以后)面试题:
1.HashMap的底层实现原理?
2.HashMap和Hashtable的区别?
3.CurrentHashMap和HashTable的区别?(暂时不讲)
1.2 Map中存储的key-value结构的理解
- Map中的key:无序的、不可重复的,使用set存储所有的key–>如果要往Map中存放自定义的类的对象,key所在的类要重写equals()和hashCode()方法(以HashMap为例)
- Map中的value:无序的、可重复的,使用Collection存储所有的value–>value所在的类要重写equals()
- 一个键值对:key-value构成了一个Entry对象
要求:

1.3 HashMap的底层实现原理(以JDK7为例)
HashMap map = new HashMap():
在实例化以后,底层创建了长度是16的一维数组Entry[] table.
...可能已经执行过多次put...
map.put(key1,value1):
首先调用key1所在类的HashCode()方法计算key1的哈希值,此哈希值经过某种算法计算以后,得到在Entry数组中的存放位置。如果此位置上的数据为空,此时的key1-value1添加成功。---情况1如果此位置上的数据不为空,意味着此位之上存在一个或多个(以链表形式存在)数据,比较key1和已经存在的一个或多个数据的哈希值:如果key1的哈希值与已经存在的数据的哈希值都不相同,此时的key1-value1添加成功。---情况2如果key1的哈希值和已经存在的某一个数据的哈希值相同,继续比较:调用key1所在类的equals()方法,比较:如果equals()返回false:此时的key1-value1添加成功。---情况3如果equals()返回true:此时使用value1替换value2补充:关于情况2和情况3:此时key1-value1和原来的数据以链表的方式存储
在不断地添加过程中,会涉及到扩容问题,默认扩容为原来容量的2倍,并将原有的数据复制过来
JDK8与JDK7在底层实现方面的不同:
1. new HashMap():底层没有创建一个长度为16的数组
2. JDK8的底层数组是: Node[],而非Entry[]
3. 首次调用put()方法时,底层创建长度为16的数组
4. jdk7底层结构只有:数组+链表。jdk8中底层结构:数组+链表+红黑树。当数组的某一个索引位置上的元素以链表形式存在的数据个数 > 8 且当前数组的长度 > 64时,
此时此索引位置上的所有数据改为使用红黑树存储(遍历效率高)
4.1 形成链表时,七上八下(JDK7:新的元素指向旧的元素,即头插。jdk8:旧的元素指向新的元素,即尾插)
面试题:负载因子值的大小,对HashMap有什么影响?
负教因子的大小决定了HashMap的数据密度。
负载因子越小,就越容易触发扩容,数据密度也越小,意味着发生碰撞的几率越小,数组中的链表也就越短,查询和插入时比较的次数也越小,性能会更高。但是会浪费一定的内容空间。而且经常扩容也会影响性能,建议初始化预设大一点的空间。
按照其他语言的参考及研究经验,会考虑将负载因子设置为0.7~0.75,此时平均检索长度接近于常数。
1.4 Map接口的常用方法
1.简单的添加、删除、比较等方法
import java.util.*;public class Test {public static void main(String[] args) {HashMap map = new HashMap();//1. 添加:Object put(Object key, Object value):将制定key-value添加到(或修改)当前map对象map.put("AA",123);map.put(45,123);map.put("BB",56);//2. 修改map.put("AA",87);System.out.println(map);//{AA=87, BB=56, 45=123}HashMap map1 = new HashMap();map1.put("CC", 123);//void putAll(Map m):将m中的所有key-value对存放到当前map中map.putAll(map1);System.out.println(map);//{AA=87, BB=56, CC=123, 45=123}//3. 删除:Object remove(Object key):移除指定key的key-value对,并返回valueObject o = map.remove("CC");System.out.println(o);//123System.out.println(map);//{AA=87, BB=56, 45=123}//4. 清空:void clear(map)清空当前map中的数据map1.clear();System.out.println(map1);//{}//5. Object get(Object key):获取指定key的value值,如果key不存在,则返回nullObject o1 = map.get(45);System.out.println(o1);//123//6. boolean containsKey(Object key):是否包含指定的keySystem.out.println(map.containsKey("AA"));//true//7. boolean containsValue(Object value):是否包含指定的value,如果有两个相同的value,只要找到一个就返回trueSystem.out.println(map.containsValue(456));//false//8. int size():返回map中key-value对的个数System.out.println(map.size());//3//9. boolean isEmpty():判断当前map是否为空System.out.println(map.isEmpty());//false//10. boolean equals(Object obj): 判断当前map和参数对象obj是否相等,System.out.println(map.equals(o1));//false,两个同样的map,里边的key和value也都一样,比较结果即为true}}
- map的遍历(keySet()、values()、entrySet()),可以取出每个key和value
package junit;
import org.junit.jupiter.api.Test;import java.sql.SQLOutput;
import java.util.*;public class Test01 {@Testpublic void test(){HashMap<Object,Object> map = new HashMap<>();map.put("AA",123);map.put(45,123);map.put("BB",56);//1. 遍历所有的key集:keySet()Set<Object> set = map.keySet();Iterator<Object> ite = set.iterator();while (ite.hasNext()){System.out.println(ite.next());}//2.遍历所有的value集:values()Collection<Object> coll = map.values();for (Object obj: coll) {System.out.println(obj);}//此处可以使用增强for循环或者迭代器//3. 遍历所有的key-value 方法1(用entrySet()方法)Set set1 = map.entrySet();Iterator iterator = set1.iterator();while (iterator.hasNext()){Object obj = iterator.next();Map.Entry entry = (Map.Entry)obj;//将Object类型强转为entry类型,为了使用get方法System.out.println(entry.getKey() + "==" + entry.getValue());}//4. 遍历所有的key-value 方法2(先使用keySet()方法得到key,然后用map.get()方法)Set<Object> set2 = map.keySet();Iterator<Object> ite1 = set2.iterator();//set是所有key的集合while (ite1.hasNext()){Object key = ite1.next();//得到每一个keyObject value = map.get(key);//调用get方法得到每一个key对应的valueSystem.out.println(key + "-->" + value);}}
}
1.5 TreeMap
- 向TreeMap中添加key-value,要求key必须是由同一个类创建的对象,因为要按照key进行排序
- 排序:自然排序、定制排序
1.6 Map实现类之五: Properties
- Properties类是Hashtable 的子类,该对象用于处理属性文件
- 由于属性文件里的 key、value 都是字符串类型,所以 Properties里的 key和l value都是字符串类型
- 存取数据时,建议使用setProperty(String key,String value)方法和getProperty(String key)方法
public class Test01 {@Testpublic void test(){Properties pros = new Properties();pros.load(new FileInputStream("jdbc.properties"));string user = pros.getProperty("user");System.out.println(user);}}
}
代码示例:
1.Collections工具类
- Collections是一个操作Collection和Map等集合的工具类,操作数组的工具类为Arrays
- Collections中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象设置不可变、对集合对象实现同步控制等方法
- Collection和Collections的区别?Collection是存储单列数据的集合接口,用来存储一个个对象,Collections是一个操作Collection和Map等集合的工具类
1.1方法
1.1.1 排序操作(均为static方法)
- reverse(List):反转List中元素的顺序
- shuffle(List):对List集合元紊进行随机排序
- sort(List):根据元素的自然顺序对指定List集合元紊按升序排序
- sort(List,Comparator):根据指定的Comparator产生的顺序对List集合元素进行排序
- swap(List,int,int):将指定list集合中的i处元素和j处元素进行交换
1.1.2 查找、替换
- Object max(Collection):根据元索的自然顺序,返回给定集合中的最大元素
- Object max(Collection,Comparator):根据Comparator指定的顺序,返回给定集合中的最大元素
- Object min(Collection)
- Object min(Collection,Comparator)
- int frequency(Collection,Object):返回指定集合中指定元素的出现次数
- void copy(List dest,List src):将src中的内容复制到dest中
- boolean replaceAll(List list,Object oldVal,Object newVal):使用新值替换List对象的所有旧值
package junit;
import org.junit.jupiter.api.Test;import java.io.FileInputStream;
import java.util.*;public class Test01 {@Testpublic void test(){ArrayList<Integer> list = new ArrayList<>();list.add(123);list.add(45);list.add(765);list.add(-97);list.add(0);System.out.println(list);//[123, 45, 765, -97, 0]//1. reverse(List):反转List中元素的顺序Collections.reverse(list);System.out.println(list);//[0, -97, 765, 45, 123]//2.shuffle(List):对List集合元紊进行随机排序Collections.shuffle(list);System.out.println(list);//每次执行后的顺序不同//3.sort(List):根据元素的自然顺序对指定List集合元紊按升序排序Collections.sort(list);System.out.println(list);//[-97, 0, 45, 123, 765]//4.swap(List,int,int):将指定list集合中的i处元素和j处元素进行交换Collections.swap(list,1,2);System.out.println(list);//[-97, 45, 0, 123, 765]//5.int frequency(Collection,Object):返回指定集合中指定元素的出现次数list.add(765);int frequency = Collections.frequency(list, 765);System.out.println(frequency);//2//6. void copy(List dest,List src):将src中的内容复制到dest中
// ArrayList<Integer> dest = new ArrayList<>();
// Collections.copy(dest,list);//报异常:IndexOutofBoundsException("source does not fit in dest"),因为copy会先比较dest和list的size//正确的:List dest1 = Arrays.asList(new Object[list.size()]);//new一个长度为list.size()的数组System.out.println(dest1);//[null, null, null, null, null, null]Collections.copy(dest1,list);System.out.println(dest1);//[-97, 45, 0, 123, 765, 765]//collections类中提供了多个synchronizedXxx()方法,该方法可使将指定集合包装成线程同步的集合,从而可以解决多线程并发访问集合时的线程安全问题//返回的List1即为线程安全的ListList list1 = Collections.synchronizedList(list);}}
相关文章:
Map接口以及Collections工具类
文章目录 1.Map接口概述1.1 Map的实现类的结构1.2 Map中存储的key-value结构的理解1.3 HashMap的底层实现原理(以JDK7为例)1.4 Map接口的常用方法1.5 TreeMap1.6 Map实现类之五: Properties 1.Collections工具类1.1方法1.1.1 排序操作(均为static方法)1.1.2 查找、替换 1.Map接…...
SOA协议DDS和Some/IP对比
SOME/IP 和 DDS 均已被纳入AUTOSAR AP的平台标准中。 SOME/IP 和 DDS是在不同的应用场景和不同的需求下诞生的技术,所以它们之间注定有很大的区别。 SOME/IP SOME/IP的全称为:Scalable service-Oriented MiddlewarE over IP,是一种面向服务…...
Sass使用
前言: 这份记录,主要是记录学习sass的学习记录,用于记录一些本人认为可能以后会用到的比较常用的一些知识点,更详细的请看sass官网 功能1-嵌套规则 Sass 允许将一套 CSS 样式嵌套进另一套样式中,内层的样式将它外层的…...
超大excel文件读,避免内存溢出
excel40M,但是用传统的读取excel方法,会报内存溢出的错误。 所以采用了下面的方式,能解决此问题: maven依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><ve…...
第0章 学习之前的准备
突然想写点关于linux的东西,一是将自己几十年来零碎的知识作以串联,二是能为正在学习路上的新手作些指引。而恰好作者的孩子是一位初一的学生,我写的这些东西也正是我手把手教授他的,现在分享出来并且命名为《linux中学教程》&…...
数组排序sort()方法
sort() 方法对数组的项目进行排序。 排序顺序可以是按字母或数字,也可以是升序(向上)或降序(向下)。 默认情况下,sort() 方法将按字母和升序将值作为字符串进行排序。 一、语法 array.sort(compareFunct…...
【.NET AI Books 前言】Azure OpenAI Service 入门
本书是为 .NET 开发者而写的,让 .NET 开发者能快速掌握 Azure OpenAI Service 的使用技巧。 ChatGPT 的到来意味着我们已经置身于 AI 引起的全新变革中,作为开发者你可能将面临几种改变: GPT 模型到来后,如何去架构好企业解决方案…...
散列查找实验(开散列) 题目编号:583
题目描述 请设计一个整型开散列表,散列函数为除留余数法,其中散列表的长度、除留余数法的模和关键码的个数由键盘输入,再根据输入由键盘输入所有的关键码。分别对三个待查值在散列表中进行查找,输出查找结果采用头插法。 输入描…...
Java版spring cloud 企业工程项目管理系统平台源码(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)
工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#…...
Go type关键字定义新类型和类型别名的区别
type关键字再定义类型和类型别名有很大的区别,前者是新定义一个数据类型,后者是对类型的重命名。 type NewString stringtype OldString stringtype NewString string声明了一个NewString类型,和string具有完全一致的数据结构,确…...
Neural Network学习笔记2
torch.nn: Containers: 神经网络骨架 Convolution Layers 卷积层 Pooling Layers 池化层 Normalization Layers 正则化层 Non-linear Activations (weighted sum, nonlinearity) 非线性激活 Convolution Layers Conv2d torch.nn.Conv2d(in_channels, out_channels, ke…...
用@Value注解为bean的属性赋值
1.Value注解 Value注解的源码,如下所示 Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE}) Retention(RetentionPolicy.RUNTIME) Documented public interface Value {String value(); }从Value注解的源码中…...
拨云见日:深入理解 HTML 解析器与有限状态机
文章目录 参考描述状态机状态机有限状态机与无限状态机有限状态机与自动售货机无限状态机与计算器 HTML 解析器HTML 解析器HTML 与有限状态机 HTML 解析器的常见状态初始状态DOCTYPE 状态注释状态标签状态开始标签状态属性状态属性名状态属性值状态 结束标签状态自闭和标签状态…...
Java线程池及其实现原理
线程池概述 线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如MySQL。 线程过多会带来额外的开销,其中包括创建销毁线程的开销、调度线程的开销等等,同时也降低了计算机…...
进程替换函数组介绍exec*
目录 前述 execl execlp execle execv execvp execvpe 前述 介绍后缀的意义: l (list):表示参数采用列表。 v(vector):参数同数组表示。 p(path):自…...
欧科云链OKLink:2023年4月安全事件盘点
一、基本信息 2023年4月安全事件共造约6000万美金的损失,与上个月相比,损失金额有所降落,但安全事件数量依旧不减。其中,Yearn Finance因参数配置错误,导致了1000多万美金的损失。同时,有一些已经出现过的…...
KubeVirt备份与还原方案【翻译】
KubeVirt备份与还原方案【翻译】 ref:https://github.com/kubevirt/kubevirt/blob/main/docs/backup-restore-integration.md 备份 为所有必需的k8s资源构建依赖关系图冻结应用程序pvc数据快照解冻应用程序将所有必需的k8s资源定义拷贝到一个共享的存储位置(可选…...
使用PyQt5设计一款简单的计算器
目录 一、环境配置: 二、代码实现 三、主程序 四、总结 本文使用PyQt5设计一款简单的计算器,可以通过界面交互实现加减乘除的功能,希望能够给初学者一些帮助。主要涉及的知识点有类的定义与初始化、类的成员函数、pyqt5的信号与槽函数等。…...
Htop使用说明
目录 引言 什么是htop htop安装 htop界面介绍 htop功能介绍 引言 我们使用服务器的时候常常需要关注下自己的程序资源占用情况,htop就是一种互动式的进程查查看器,整齐用下来感觉比top的逼格高,造作可视化都更方便些,我觉得还…...
PostgreSQL Linux安装
安装依赖: sudo yum -y install readline-devel zlib-devel 安装Postgres: ssh hadoophadoop001 #下载Postgres wget https://ftp.postgresql.org/pub/source/v14.2/postgresql-14.2.tar.gz tar -zxvf postgresql-14.2.tar.gz -C /data #编译前准备 /dat…...
Perplexity事实核查引擎技术白皮书(2024Q3最新架构拆解)
更多请点击: https://kaifayun.com 第一章:Perplexity事实核查引擎的演进脉络与核心定位 Perplexity事实核查引擎并非从零构建的全新系统,而是深度整合学术验证机制、实时知识图谱更新能力与多源交叉比对逻辑的第三代事实推理基础设施。其演…...
户外太阳能监控供电方案:如何用CN3791芯片为3.7V锂电池设计稳定充电电路?
户外太阳能监控供电方案:CN3791芯片在3.7V锂电池充电电路中的实战设计 清晨六点,当第一缕阳光洒在郊区的通信基站上,搭载CN3791芯片的太阳能供电系统已经开始为锂电池注入能量——这正是现代户外监控设备赖以生存的"能量心脏"。在无…...
3ds Max离线帮助文档还能这么用?打造你的个人3D知识库(含效率翻倍技巧)
3ds Max离线帮助文档的进阶玩法:构建你的私有3D知识引擎 当大多数3D艺术家还在依赖零散的在线教程和碎片化笔记时,一小部分资深用户已经将3ds Max离线帮助文档改造成了私人定制的专业知识库。这不仅仅是一个本地化的文档集合,而是一个可以深度…...
fpga开发过程中遇到的一些小问题
vivado开发过程中的一些error1、[Chipscope 16-213] The debug port u_ila_0/probe13 has 28 unconnected channels (bits). This will cause errors during implementation.2、ERROR: [Labtools 27-3312] Data read from hw_ila [hw_ila_1] is corrupted. Unable to upload wa…...
Symfony String测试指南:如何编写高质量的字符串操作测试用例
Symfony String测试指南:如何编写高质量的字符串操作测试用例 【免费下载链接】string Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way 项目地址: https://gitcode.com/gh_mirrors…...
ARM+FPGA异构计算在能源电力领域的核心优势与应用实践
1. 项目概述:为什么是ARMFPGA?最近几年,在能源电力这个对可靠性和实时性要求极高的领域,我观察到一股明显的技术趋势:越来越多的项目开始采用“国产ARM处理器 FPGA”的异构计算架构。这不再是实验室里的概念验证&…...
3天掌握Dify工作流开发:从零构建企业级AI应用的完整指南
3天掌握Dify工作流开发:从零构建企业级AI应用的完整指南 【免费下载链接】Awesome-Dify-Workflow 分享一些好用的 Dify DSL 工作流程,自用、学习两相宜。 Sharing some Dify workflows. 项目地址: https://gitcode.com/GitHub_Trending/aw/Awesome-Dif…...
喜马拉雅音频下载神器:告别网络限制,随时随地畅听付费内容
喜马拉雅音频下载神器:告别网络限制,随时随地畅听付费内容 【免费下载链接】xmly-downloader-qt5 喜马拉雅FM专辑下载器. 支持VIP与付费专辑. 使用GoQt5编写(Not Qt Binding). 项目地址: https://gitcode.com/gh_mirrors/xm/xmly-downloader-qt5 …...
RimWorld模组管理终极指南:3步掌握RimSort智能排序,告别游戏崩溃烦恼
RimWorld模组管理终极指南:3步掌握RimSort智能排序,告别游戏崩溃烦恼 【免费下载链接】RimSort RimSort is an open source mod manager for the video game RimWorld. There is support for Linux, Mac, and Windows, built from the ground up to be a…...
小红书无水印下载终极指南:如何用XHS-Downloader快速保存优质内容
小红书无水印下载终极指南:如何用XHS-Downloader快速保存优质内容 【免费下载链接】XHS-Downloader 小红书(XiaoHongShu、RedNote)链接提取/作品采集工具:提取账号发布、收藏、点赞、专辑作品链接;提取搜索结果作品、用…...
