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

亚商投资顾问 早餐FM/0509车辆电动化
01/亚商投资顾问 早间导读 1.上交所拟于5月11日举办“发现央企投资价值,促进央企估值回归”交流会 2.监管部门十方面举措加强房地产经纪行业管理 3.广东:推动城市公共服务及货运配送车辆电动化替代 4.昆山两楼盘因大幅降价被暂停网签:降幅…...

AI绘画天花板——Midjourney注册使用保姆级教程(5月5日验证有效)
大家好,我是可夫小子,关注AIGC、读书和自媒体。解锁更多ChatGPT、AI绘画玩法。加我,备注:aigc,拉你进群。 现在市面上AI绘图大概有三大阵营:Midjourney、Stable Diffusion,还有一个就是OpenAI实…...

学习笔记(2)项目结构描述 - manifest.json和pages.json
目录 1,manifest.json2,pages.json2.1,pages2.2,globalStyle2.3,tabBar 1,manifest.json 官方详情 uni-app 的 appid 由 DCloud 云端分配,主要用于 DCloud 相关的云服务,请勿自行修…...

vector、deque、list相关知识点
vector erase返回迭代器指向删除元素后的元素insert返回迭代器指插入的元素reserve只给容器底层开指定大小内存空间,并不添加新元素 deque 底层数据结构 动态开辟的二维数组,一维数组从2开始,以2倍方式扩容,每次扩容和&#x…...

多维时序 | MATLAB实现基于VMD-SSA-LSSVM、SSA-LSSVM、VMD-LSSVM、LSSVM的多变量时间序列预测对比
多维时序 | MATLAB实现基于VMD-SSA-LSSVM、SSA-LSSVM、VMD-LSSVM、LSSVM的多变量时间序列预测对比 目录 多维时序 | MATLAB实现基于VMD-SSA-LSSVM、SSA-LSSVM、VMD-LSSVM、LSSVM的多变量时间序列预测对比预测效果基本介绍程序设计学习总结参考资料 预测效果 基本介绍 多维时序 …...

设计模式——适配器模式(类适配器、对象适配器)
是什么? 我们平时的有线耳机接口分为USB的和Type-C的接口,但是手机的耳机插口却只有一个,像华为的耳机插口现在基本都是Type-c的,那如果我们现在只有USB接口的耳机怎么办呢,这个时候就需要使用到一个转换器,…...

iOS开发多target
场景 背景:设想一下有一个场景,一个业务分为多种身份,他们大部分功能是相同的,但是也有自己的差异性。这种情况,想要构建出不同身份的APP。你会怎么做??? 当然,你可以拷贝一份代码出来,给项目重新命名。这样做的好处是,他们互相不会冲突,不用去关心是否有逻辑的冲…...

100种思维模型之每日评估思维模型-58
曾子曰:吾日三省吾省,为人谋而不忠乎?与朋友交不信乎?传不习乎? 曾国藩,坚持每日写复盘日记,最后他用自己的实践经历向我们证明:一个智商很平庸、出身很普通且有着各种毛病的人&…...

libreoffice api
libreOffice API是用于访问libreOffice的编程接口。可以使用libreOffice API创建、打开、修改和打印libreOffice文档。 LibreOffice API支持Basic、Java、C/C、Javascript、Python语言。 这是通过一种称为通用网络对象 (Universal Network Objects, UNO) 的技术实现的ÿ…...

全网最火,Web自动化测试驱动模型详全,一语点通超实用...
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 自动化测试模型&a…...