Java 常见集合类

news2024/12/23 22:23:07

集合的整体框架

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.coloradmin.cn/o/1664066.html

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

相关文章

使用AudioCraft(MusicGen)生成音乐

AudioCraft 是一个 PyTorch 库,用于音频生成的深度学习研究。AudioCraft 包含两个先进的AI生成模型:AudioGen和MusicGen,它们共同致力于生成高质量的音频内容。 MusicGen是一个简单且可控的音乐生成模型。它利用Meta提供的20K小时授权音乐进行训练,能够根据文本描述或已有…

1_1. Linux简介

1_1. Linux简介 文章目录 1_1. Linux简介1. 我们用linux来干嘛2. 计算机组成3. 操作系统4. Linux哲学思想5. Linux目录6. Linux分区类型 1. 我们用linux来干嘛 1. 大家都知道linux是一个操作系统&#xff0c;它是一个基础的软件&#xff0c;操作系统是硬件与应用程序的中间层。…

JS中的arguments是什么?

arguments是当我们不确定有多少个参数传递时&#xff0c;就可以使用argument来获取。在js中&#xff0c;arguments实际上就是当前函数的一个内置对象&#xff0c;存储了我们传递的所有实参。arguents的展示形式就是一个伪数组&#xff0c;所以我们可以对它进行遍历。 我们先来…

使用J-Link Commander / JFlash 烧写固件程序(以STM32F103C8T6为例)

使用JFlash 烧写流程 运行JFlash, 点击Project Settings 配置Jlink为SWD方式,选择连接设备为STM32F103C8T6, 点击确定. 选择要烧录的Bin文件 设置bin文件烧录地址, 点击OK(地址要在0x08000000-0x0800FFFF范围内) Note : STM32F103C8T6 Flash大小为 64KB&#xff0c; 地址范围…

Windows只能安装在GPT磁盘上

转换磁盘分区形式 步骤1. 先按照正常流程使用Windows系统安装光盘或系统U盘引导计算机。 步骤2. 在Windows安装程序中点击“开始安装”&#xff0c;然后按ShiftF10打开命令提示符。 步骤3. 依次输入以下命令&#xff0c;并在每一行命令后按一次Enter键执行。 步骤4. 等待转换…

[Linux][网络][数据链路层][一][以太网][局域网原理]详细讲解

目录 0.对比理解"数据链路层"和网络层1.以太网1.认识以太网2.以太网帧格式3.认识MAC地址4.以太网帧格式如何封装/解包&#xff1f;5.以太网帧格式如何分用&#xff1f; 2.重谈局域网通信原理0.如何形象的理解&#xff1f;1.理解局域网通信2.在发送数据的时候&#xf…

连接和使用vCenter Server嵌入式vPostgres数据库

vCenter Server 早期支持内嵌(embedded)和外部(external)数据库,内嵌数据库就是vPostgres,基于VMware Postgres数据库(PostgreSQL数据库),外部数据库用的多的是Oracle数据库和SQL Server数据库。因为早期使用内嵌的PostgreSQL数据库只能用于小型环境,比如仅支持几十台…

算法详解——回溯法

一、回溯法概述——问题背景 回溯法是一种解决约束满足问题的方法&#xff0c;特别适用于解决组合问题、搜索优化问题等。它通过逐步构建候选解决方案并且在这个解决方案不再可能满足约束或条件时进行剪枝和回溯。具体来说&#xff0c;回溯法可以应用于以下类型的问题&#xff…

【高阶数据结构】图--最短路径问题

图--最短路径问题 一、单源最短路径--Dijkstra算法1、简介2、解析3、代码4、测试用例5、打印最小路径代码和测试6、缺陷&#xff1a;不能使用负路径 二、单源最短路径--Bellman-Ford算法1、简介2、解析&#xff08;1&#xff09;详情i、负权问题&#xff1a;一个点只跑一趟找最…

整除C++

题目&#xff1a; 思路&#xff1a; 循环遍历7(可以被 7 整除的正整数最小为7)~n&#xff0c;如果i%70&#xff0c;就说明i可以被7整除. 代码&#xff1a; #include<iostream> using namespace std; int n;//一个正整数 int main(){scanf("%d",&n);//输入…

Vue.js【路由】

初识路由 提到路由&#xff08;Route&#xff09;&#xff0c;一般我们会联想到网络中常见的路由器&#xff08;Router&#xff09;&#xff0c;那么路由和路由器之间有什么关联呢&#xff1f;路由是指路由器从一个接口接收到数据&#xff0c;根据数据的目的地址将数据定向传送…

git-删除workspace.xml的跟踪

问题描述 .gitignore 文件内容如下&#xff1a; .pyc *.pyc user_files/ .vscode/ __pycache__//.idea/misc.xml /.idea/modules.xml /.idea/inspectionProfiles/profiles_settings.xml /.idea/inspectionProfiles/Project_Default.xml /.idea/batrp_webbackend-server-dev.i…

Java 开发 框架安全:Spring 漏洞序列.(CVE-2022-22965)

什么叫 Spring 框架. Spring 框架是一个用于构建企业级应用程序的开源框架。它提供了一种全面的编程和配置模型&#xff0c;可以简化应用程序的开发过程。Spring 框架的核心特性包括依赖注入&#xff08;Dependency Injection&#xff09;、面向切面编程&#xff08;Aspect-Or…

【Linux笔记】 基础指令(二)

风住尘香花已尽 日晚倦梳头 重命名、剪切指令 -- mv 简介&#xff1a; mv 命令是 move 的缩写&#xff0c;可以用来移动文件或者将文件改名&#xff0c;是 Linux 系统下常用的命令&#xff0c;经常用来备份文件或者目录 语法&#xff1a; mv [选项] 源文件或目录 目标文件或目录…

笨方法自学python(三)-数学计算

数字和数学计算 这章练习里有很多的数学运算符号。我们来看一遍它们都叫什么名字 plus 加号-minus 减号/ slash 斜杠*asterisk 星号% percent 百分号< less-than 小于号greater-than 大于号< less-than-equal 小于等于号 greater-than-equal 大于等于号 print ("I …

刷t2、、、

、、 public class ThisTest {public static void main(String args[]) {int i;for (;;) {System.out.println(1);}} } while()的循环条件等于for中循环条件。循环体会有一个条件改变等于for中类似自增条件。while()判断条件一般在while前面会初始化跟for中初始化一样。这样 w…

【讲解下目标追踪】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

ECharts系列文章汇总(持续更新中)

ECharts介绍 ECharts是一款基于JavaScript的数据可视化图表库&#xff0c;提供了直观、生动、可交互、可个性化定制的数据可视化图表。以下是关于ECharts的详细介绍&#xff1a; 发展历程&#xff1a; ECharts最初由百度团队开源&#xff0c;并在2018年初捐赠给Apache基金会&…

软件工程经济学--期末复习资料

软件工程经济学--期末复习资料 前言第一章 绪论第二章 软件工程经济学基础第三章 软件的成本管理与定价分析第四章 软件工程项目评价方法与经济效果评价第五章 软件生产函数、效益分析及不确定性分析第六章 软件工程项目进度计划的制定结尾总结 前言 软件工程经济学&#xff0…

Github2024-05-10开日报 Top10

根据Github Trendings的统计&#xff0c;今日(2024-05-10统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目4TypeScript项目4JavaScript项目1Lua项目1C项目1Rust项目1Dart项目1 RustDesk: 用Rust编写的开源远…