Java 常见集合类

集合的整体框架

Java 的集合,也可以叫做容器,根据集合的整体框架可以看出,主要是两大集合接口:第一个是 Collection 接口,主要用来存放单一的元素对象;另一个是 Map 接口,主要用于存储键值对。

Collection 接口有三个子类,List、Set、Queue,下面是抽象类和具体实现类,主要说明具体实现类。常见的有 ArrayList、LinkedList、HsahSet、LinkedHashSet、HsahMap、LinkedHshMap等。

058baa66a2d64680adde65397f1e8ae3.png

集合接口

接口描述
Collection 接口

最基本的集合几口,一个Collection 代表了一组 Object,即 Collection 的元素,Java 提供了继承于它的子接口List、Set、Queue。

存储一组不唯一,无序的对象。

List 接口

特点:有序,不唯一。

使用此接口能精确控制每个元素插入的位置,能够通过索引(类似数组的下标)来访问集合中的元素,同样的,起始于元素索引为 0。

Set 接口

特点:无序,唯一。

Queue 接口队列,按特定的排序规则来确定先后顺序,存放的元素是有序的、可重复的
Map 接口

特点:存放键值对(key-value),key 无序且唯一,value 是无序不唯一的。

算法上常见用来统计数量。

List 和 Set 的区别

特点不同,list 存储的数据有序不唯一,set 存储的数据无序且唯一。

因为索引的存在,list 检索的效率比 set 高,但是 set 的删除和插入的效率高。List 插入元素会改变其他元素的位置。

list 和数组类似,可以动态增长,比如 ArrayList 。

List 接口的实现类

ArrayList

继承并实现了 List 接口,基于动态数组实现,相较于 Array(静态数组) 使用起来更加灵活。

1. ArrayList 动态数组,会根据实际存储的元素动态扩容或缩容,而 Array 被创建之后就不能修改长度,这里涉及到知识点 ArrayList 动态扩容机制。

2. ArrayList 可以使用泛型来确定存储的类型,对于存储的基本数据类型,必须使用对应的包装类(int 的包装类 Integer)来存储。

顺带一提,常见的创建 Arraylist 的方法是

List<Integer> llist = new ArrayList<>();

List 是接口,ArrayList 是具体实现。主要是为了灵活性和可扩展性,这里可以使用List已经定义的方法,不可以使用Arraylist自己的方法,当需要将ArrayList改成其他实现时,只需要将创建集合实例的代码改成想要创建的对象,不用在去修改其他方法代码。

ArrayList 扩容机制

7865c52d3f9845e58c5d6a0cbe7e7cc8.jpg

LinkedList

不同于ArrayList,LinkedList 底层是双向链表。根据链表的特性,每个节点不仅保存了每个元素,还保存了下一个元素的引用。支持随机访问,因为提供了get方法,但是并不高效,假设数据量比较大,需要从首个元素开始遍历,然后查看节点对下一个元素的引用是否为需要的元素,一直循环。

Set 的实现类

对比HashSet、LinkedHashSet、TreeSet。最大的区别就是各自的底层实现不同,分别是哈希表(基于HashMap实现),链表哈希表和红黑树。

Queue

单列队列,遵循队列的先进先出原则,就像排队坐车,先来后到。

Map

HashMap的底层实现

这是一道经典的面试题。在JDK 1.8 以前,HashMap 的底层是数组+链表,通过 哈希函数激素那元素的哈希值,判断元素存储的位置。如果当前位置已经存在了元素,那么就进行判断是否相同,如果不同,就通过拉链法,在数组的后面加上链表来解决哈希冲突。

在JDK1.8之后,底层在数组和链表的基础上,为了解决因为哈希冲突导致链表深度过高的问题,引入了红黑树解决因为深度高导致的查询效率慢。

链表转红黑树:当链表长度大于8时,并且此时数组的容量不小于64时,会把链表转换为红黑树。

红黑树转链表:相反的,因为删除元素导致红黑树的节点不大于6个时,红黑树会重新转换为链表。

为什么选择8作为转换红黑树的阈值。因为根据测算,哈希冲突导致链表长度达到8的概率非常小,几乎到了百万分之一。

为什么选择6作为红黑树转换为链表的阈值。因为如果选取7为阈值,当出现相同元素频繁插入删除,会导致频繁转换,会影响性能。

红黑树的特征

1. 节点颜色:每个节点的都有颜色,红色和黑色。

2. 根节点:根节点总是黑色的

3. 叶子节点:叶子节点都是空节点(NIL 节点)都是黑色。

4. 红色节点限制:不存在连续两个红的节点,红色节点都被黑色节点隔开

5. 路径的和节点:从任一个节点到其后代叶子节点的路径上,包含相同数目的黑色节点。

二叉查找树在一些极端的情况下会出现深度过高,退化成链表的情况,此时查询效率比较低。

之后又出现了自平衡的查找树,比如 AVL,红黑树等。通过定义一些性质,将任意节点的左右子树的高度差控制在规定范围内,达到平衡状态。

不过普通的平衡二叉树可能出现某个路径深度相较其他路径更高,同样会导致效率降低。

红黑树根据后两个而性质,将每个路径的深度差保证在一定范围内。最长的路径不会超过最短路径的两倍。

线程安全的集合

上述的集合都是线程不安全的。线程安全的集合常见的有 ConcurrentHashMap 和 Hashtable。

二者的区别:

首先是底层结构。ConcurrentHashMap 采用的和 HashMap 一样是 数组+链表(红黑树),Hashtable 使用的是 数组+链表 的形式。链表是为了解决哈希冲突存在的。

实现线程安全的方式 

在 JDK1.7的时候,ConcurrentHashMap 对整个桶组进行了分割分段,然后对每段进行加锁,多线程访问不同数据段的数据。

在 JDK 1.8的时候,ConcurrentHashMap 使用 数组和链表红黑树来实现。并发控制使用 synchronized 和 CAS 算法来操作。

Hashtable 使用 synchronized保证线程安全,效率比较低,多个线程访问同一个方法是可能会出现阻塞。

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

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

相关文章

国产版Sora到来!视频大模型更上一层楼

大模型的快节奏发展&#xff0c;让了解最新技术动态、积极主动学习成为每一位从业者的必修课。InfoQ 研究中心期望通过每周更新大模型行业最新动态&#xff0c;为广大读者提供全面的行业回顾和要点分析。现在&#xff0c;让我们回顾过去一周的大模型重大事件吧。 一、重点发现…

词令蚂蚁新村今日答案:微信小程序怎么查看蚂蚁新村今天问题的正确答案?

微信小程序怎么查看蚂蚁新村今天问题的正确答案&#xff1f; 1、打开微信&#xff0c;点击搜索框&#xff1b; 2、打开搜索页面&#xff0c;选择小程序搜索&#xff1b; 3、在搜索框&#xff0c;输入词令搜索点击进入词令微信小程序&#xff1b; 4、打开词令微信小程序关键词口…

利用一下Chat-GPT写两段处理字符串的简单样例ABAP程序。这样可以大大提高工作效率。Chat-GPT的能力真是让人震撼。

我让Caht-GPT写两段ABAP 程序&#xff0c;第一段程序要求如下&#xff1a; 判读字符串里面是否含有特殊字符&#xff0c;这里说的特殊字符不包括键盘上能够输入的字符&#xff0c;如果有这样的特殊字符则输出来。 DATA: lv_string TYPE string VALUE 你的字符串,lv_result TYP…

算法金 | Xorbits,一个超强的 Python 库

本文来源公众号“算法金”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;Xorbits&#xff0c;一个超强的 Python 库 1 Xorbits 库介绍 在数据科学和机器学习的世界里&#xff0c;处理大规模数据集和复杂计算的需求日益增长。 这…

【Go】Go Swagger 生成和转 openapi 3.0.3

本文档主要描述在 gin 框架下用 gin-swagger 生成 swagger.json 的内容&#xff0c;中间猜的坑。以及&#xff0c;如何把 swagger 2.0 转成 openapi 3.0.3 下面操作均在项目根目录下执行 生成 swagger 2.0 import swagger go get -u github.com/swaggo/gin-swagger go get …

数据中台:企业数字化转型的桥梁_光点科技

在数字化日益深入企业核心运营的今天&#xff0c;数据中台作为一个关键的信息化架构&#xff0c;正逐渐崭露头角&#xff0c;成为连接企业各部门、优化数据管理和推动业务创新的重要桥梁。 一、数据中台&#xff1a;连接与整合的桥梁 数据中台的核心作用在于连接与整合。传统的…

apk反编译修改教程系列-----让你反编译apk中 事半功倍的辅助编译软件列举【十六】

在反编译apk中。排除我们常用的编译软件外。还有很多辅助编译软件。例如用来查看代码 转换语言 加解密算法 文件监听 弹窗定位 activity记录 签名验证 dex文件混淆 签校测试 apk伪加密 apk对齐 拆分dex 合并dex 等等类似的功能 通过此课程了解; 01----反编译软件中列…

【RAG 博客】RAG 应用中的 Routing

Blog&#xff1a;Routing in RAG-Driven Applications ⭐⭐⭐⭐ 根据用户的查询意图&#xff0c;在 RAG 程序内部使用 “Routing the control flow” 可以帮助我们构建更实用强大的 RAG 程序。路由模块的关键实现就是一个 Router&#xff0c;它根据 user query 的查询意图&…

【Linux】环境变量是什么?如何配置?详解

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

计算机网络实验1:交换机基本配置管理

实验目的和要求 安装Packer Tracer&#xff0c;了解Packer Tracer的基本操作掌握交换机基本命令集实验项目内容 认识Packet Tracer软件 交换机的基本配置与管理 交换机的端口配置与管理 交换机的端口聚合配置 交换机划分Vlan配置 实验环境 硬件&#xff1a;PC机&#x…

PCB检查

文章目录 1、打开DRC2、database check3、检查DRC4、检查多余的线5、其他需要注意的点a.检查差分线、等长线是否已调好b.注意检查晶振、电感等元件上/下方是否其他线经过&#xff08;一般不允许线经过&#xff09;c.打开place_bound_top/bottom 检查元件是否超过这个允许范围d.…

用HAL库改写江科大的stm32入门例子8-1 DMA数据转运

实验1-实验目的&#xff1a;通过DMA把buffer的数据搬运到buffer2当中。 //declare a buffer to store the data uint32_t buffer[3] {1,2,3};//declare a buffer to store the data uint32_t buffer2[3] {0,0,0}; DMA&#xff1a;是个搬运数据的小助手。 相关设置&#xff1…

mac第三方软件怎么删除 MacBook卸载第三方应用程序 mac第三方恶意软件删除不了怎么办呢

Mac是一款优秀的个人电脑&#xff0c;它拥有流畅的操作系统、强大的性能和丰富的应用程序。但是&#xff0c;随着使用时间的增加&#xff0c;你可能会发现你的Mac上安装了一些不需要或者不喜欢的第三方软件&#xff0c;这些软件可能会占用你的空间、影响你的速度或者带来安全风…

1905. 统计子岛屿

1905. 统计子岛屿 java&#xff1a;DFS class Solution {Boolean flag true;private void dfs(int x, int y, int m, int n, int[][] grid1, int[][] grid2) {if (x < 0 || x > m || y < 0 || y > n || grid2[x][y] ! 1) { // 包含关系&#xff1a;遍历最小范围…

Android 面试之Kotlin 协程上下文和异常处理

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 上下文是什么 CoroutineContext是一组用于定义协程行为的元素&#xff0c;包括以下几部分&#xff1a; Job&#xff1a;控制协程的生命周期Co…

没有公网ip,如何实现外网访问内网?

目前拨号上网是最广泛的上网方式&#xff0c;这种方式优点是价格便宜&#xff0c;缺点是没有固定公网ip&#xff0c;每次重新您拨号ip地址都会变。如果有一台服务器&#xff0c;需要实现外网访问&#xff0c;在没有固定公网ip的环境下&#xff0c;该如何实现呢&#xff1f;使用…

进程间通信(二)

共享内存 当进程A和进程B有一块共享的内存空间时&#xff0c;这两个进程之间的数据交互就会变的很简单&#xff0c;只需要像读取自己内存空间中的元素一样去读取数据即可。实现共享内存进行数据交互的一般步骤&#xff1a; 创建/打开共享内存内存映射数据交换断开与共享内存的…

驾驭多云环境,加速AI创新丨Animbus Cloud 8.3.0 算力调度平台升级发布

大模型开启全球新一轮AI浪潮&#xff0c;伴随算力规模的爆发增长以及计算技术的多元创新&#xff0c;需要更稳定、高效、敏捷的异构计算基础设施&#xff0c;才能充分发挥对算力能力的重要支撑。 作为开放智能云边架构引领者&#xff0c;九州未来凭借多年的技术积累、实践沉淀…

巨坑啊! before-upload返回false 会执行on-remove

通过对on-remove对应参数的打印&#xff0c;发现回调中的file参数有个status&#xff0c;若是是在before-upload中就被过滤了&#xff0c;就是ready&#xff0c;若是已经上传成功了去点击删除&#xff0c;status是success&#xff0c;就他了。 onRemove(file,fileList){if(file…

ESP32重要库示例详解(一):EEPROM之Preferences库

1. 了解EEPROM 在嵌入式系统开发中&#xff0c;断电后晚能存储少量数据是常见需求。EEPROM&#xff08;Electrically Erasable Programmable Read-Only Memory&#xff09;是一种非易失性存储器&#xff0c;即使断电数据也不会丢失。ESP32的EEPROM模拟功能利用闪存空间&#x…