Java 入门指南:集合概述

news2024/11/26 16:43:40

Java集合概述

Java 集合(Collections)是 Java 中提供的一种容器,用于存储和管理多个对象。与数组不同,集合的长度是可变的,且只能存储对象(包括对象的引用),不能存储基本数据类型。集合是 Java 编程中非常重要的一部分,特别是在处理大量数据时,集合提供了丰富的操作方法和灵活的数据结构。

Java集合的体系结构

Java 集合,也叫作容器,主要是由两大接口派生而来:

  1. 一个是 Collection 接口,主要用于存放单一元素
    Collection 接口,又有三个主要的子接口:ListSetQueue

  2. 另一个是 Map 接口,主要用于存放双列数据,保存了具有映射关系的键值对 “key-value” 集合

![[Java 集合框架.png]]
图中只列举了主要的继承派生关系,并没有列举所有关系。如省略了AbstractList, NavigableSet 等抽象类以及其他的一些辅助类。

Collection 接口

Collection接口是构建集合框架的基础,它是单列集合的根接口,定义了集合的基本操作,如添加、删除、遍历等。Collection接口有两个重要的子接口:ListSetList 接口维护元素的顺序,而 Set 接口不允许有重复的元素。

List 接口

List有序集合(也称为序列),允许元素重复List接口的主要实现包括ArrayListVectorLinkedList

ArrayList
  • 底层实现ArrayList 使用一个动态数组 Object[] 来存储元素。
  • 特点:访问速度快,因为元素存储在连续的内存空间中。插入和删除操作相对较慢,因为它们可能需要移动大量元素。
  • 线程安全性:非线程安全,如果多个线程并发访问和修改ArrayList,需要手动同步或使用 Collections.synchronizedList
Vector
  • 底层实现VectorArrayList 类似,也是使用一个动态数组Object[]来存储元素。
  • 特点VectorArrayList 的主要区别在于它是线程安全的,因此在多线程环境中使用 Vector 更加安全。
  • 性能:由于 Vector 中的方法是同步的,所以在单线程环境中性能不如ArrayList
LinkedList
  • 底层实现LinkedList 使用双向链表来存储元素。在JDK 1.6及以前版本中,LinkedList使用循环双向链表;而在 JDK 1.7 及以后版本中,取消了循环特性。
  • 特点:插入和删除操作非常快,因为只需要更新指针即可。但是随机访问较慢,因为需要从头遍历链表。
  • 适用场景:适合频繁插入和删除的场景,如实现栈和队列。
Set 接口

Set接口是一个不允许重复元素的集合。它的主要实现包括HashSetLinkedHashSetTreeSet

HashSet
  • 底层实现HashSet基于HashMap实现,实际上它是一个键值对的集合,其中键就是元素本身,值总是PRESENT
  • 特点:不保证集合中元素的顺序,元素的顺序由哈希码决定。
  • 线程安全性:非线程安全。
LinkedHashSet
  • 底层实现LinkedHashSetHashSet的一个子类,它通过LinkedHashMap来实现,因此它维护了一个按插入顺序排列的链表。
  • 特点:元素按照插入顺序排序。
  • 线程安全性:非线程安全。
TreeSet
  • 底层实现TreeSet使用红黑树(一种自平衡的排序二叉树)来存储元素。
  • 特点:自然排序或自定义排序,元素是按升序排序的。
  • 线程安全性:非线程安全。
Queue 接口

Queue 接口是一个用于存储元素的集合,也属于 Collection 接口,通常按照先进先出(FIFO)的原则处理元素。Queue接口的主要实现包括PriorityQueueDelayQueueArrayDeque

PriorityQueue
  • 底层实现PriorityQueue使用Object[]数组来实现小顶堆(最小值在顶部)。
  • 特点:队列中的元素会自动排序,最小的元素在队列的头部。
  • 线程安全性:非线程安全。
DelayQueue
  • 底层实现DelayQueue是一个特殊的Queue实现,它使用PriorityQueue作为其内部数据结构。
  • 特点:队列中的元素是Delayed类型的,只有当延迟到期时,元素才可从队列中取出。
  • 线程安全性:非线程安全,但在多线程环境下通常使用ReentrantLock等同步机制。
ArrayDeque
  • 底层实现ArrayDeque使用一个可动态扩展的数组来存储元素。
  • 特点:既可以当作栈使用,也可以当作队列使用。
  • 线程安全性:非线程安全。
适用场景

选择合适的集合类型取决于具体的应用场景。例如:

  • 如果需要一个有序且可重复的集合,可以选择ArrayListLinkedList

  • 如果需要一个去重的集合,可以选择HashSetTreeSet

  • 如果需要实现队列的功能,可以选择PriorityQueueArrayDeque

每种集合都有其特定的优势和适用场景,理解它们的内部实现可以帮助你更好地选择合适的数据结构。

Map 接口

Map (用 key 来搜索的专家): 使用键值对(key-value)存储,key 是无序的、不可重复的,value 是无序的、可重复的,每个键最多映射到一个值。

HashMap

HashMap:JDK1.8 之前 HashMap数组+链表 组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突)。

JDK1.8 以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间。

LinkedHashMap

LinkedHashMapLinkedHashMap 继承自 HashMap,所以它的底层仍然是基于拉链式散列结构即由数组和链表或红黑树组成

LinkedHashMap 在上面结构的基础上,增加了一条双向链表,使得上面的结构可以保持键值对的插入顺序。同时通过对链表进行相应的操作,实现了访问顺序相关逻辑。

Hashtable

Hashtable数组+链表组成的,数组是 Hashtable 的主体,链表则是主要为了解决哈希冲突而存在的。

Hashtable

Hashtable:红黑树(自平衡的排序二叉树),能够根据键的自然顺序或自定义比较器对键进行排序。

为什么选择集合

当需要存储一组类型相同的数据时,数组是最常用且最基本的容器之一。但是,使用数组存储对象存在一些不足之处,在实际开发中,存储的数据类型多种多样且数量不确定

与数组相比,Java 集合提供了更灵活、更有效的方法来存储多个数据对象。Java 集合框架中的各种集合类和接口可以存储不同类型和数量的对象,同时还具有多样化的操作方式。

相较于数组,Java 集合的优势在于它们的大小可变、支持泛型、具有内建算法等。提高了数据的存储和处理灵活性,可以更好地适应现代软件开发中多样化的数据需求,并支持高质量的代码编写。

如何选用集合

主要根据集合的特点来选择合适的集合。比如:

  • 需要 根据键值获取到元素值 时就选用 Map 接口下的集合:

    1. 需要排序 时选择 TreeMap
    2. 不需要排序 时就选择 HashMap
    3. 需要保证线程安全 就选用 ConcurrentHashMap
  • 只需要 存放元素值 时,就选择实现Collection 接口的集合:

    1. 需要保证元素唯一时选择实现 Set 接口的集合比如 TreeSetHashSet
    2. 不需要就选择实现 List 接口的比如 ArrayListLinkedList,然后再根据实现这些接口的集合的特点来选用。

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

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

相关文章

jmeter中导入java方法并使用

1、首先打开idea,在idea中点击File-New-Project ,创建一个项目,项目名为JmtOne 2、项目创建完成后,直接在main函数中定义两个方法,记住该主函数的包名跟类名,后面会用到,在类中定义了两种拆分字符串的方法&…

FLUX.1 当前支持FLUX.1的Lora模型

首先,我们来梳理一下本次Xlabs-AI团队放出的七款Lora模型,分别是 写实、Furry(但是目前该模型还不支持ComfyUI)、MJV6、动漫、迪斯尼、风景和艺术风格。每种模型都经过精心训练,能够为 Flux 模型带来卓越的风格转换能…

嵌入式day31

mplayer项目问题分析: 知识短时间内可以获取到 能力的提升一定需要练习 IPC 进程间通信方式 共享内存 //最高效的进程间通信方式 共享内存: 1.是一块 内核预留的空间 2.最高效的通信方式 //避免了用户空间到内核空间的数据拷贝 操作: …

第三方软件测评机构进行安全测试的好处

根据报告显示,2023年全球因网络安全事件造成的损失是8万亿美元,其中70%是由于软件漏洞引起的。这一数据足以表明,企业在软件开发过程中必须重视安全测试。软件安全测试不仅是对软件质量的保障,更是对用户信息和财务安全的保护。 …

QT事件机制理解

事件和信号 从硬件层来看: 事件就是一种中断, 中断的产生形式: 1.用户操控硬件所产生的中断。 2.由系统自身所产生的中断,比如说定时器。 这种中断由系统内核监控,由系统内核接收到中断并向CPU发出的执行请求就叫信号。所以说事件是信号产生…

《Cloud Native Data Center Networking》(云原生数据中心网络设计)读书笔记 -- 06容器网络

本章将回答以下问题 Linux上可用的容器网络组件有哪此?各种选择的限制和性能特征是什么? 命令空间 命名空间是一个 Linux 内核虚拟化组件。该组件类似 Linux 内核提供的网络和服务器虚拟化的组件。命名空间对内核管理的特定的资源进行虚拟化,允许一个虚拟资源有…

Moodle与ONLYOFFICE集成如何实现智能教学管理

陈老老老板🤴 🧙‍♂️本文专栏:生活(主要讲一下自己生活相关的内容)生活就像海洋,只有意志坚强的人,才能到达彼岸。 🧙‍♂️本文简述:ONLYOFFICE相信大家已经有所了解,本篇讲一下如…

2024年10月湖北省自学考试报名流程(5步)

2024年10月湖北省自学考试报名流程(5步) #自学考试 #自考报名 #湖北自考 #湖北自考本科 #湖北自考报名 #湖北自考专科 #湖北省自学考试

Linux信号机制探析--信号的产生

🍑个人主页:Jupiter. 🚀 所属专栏:Linux从入门到进阶 欢迎大家点赞收藏评论😊 目录 📚信号什么是信号?为什么要有信号?查看Linux系统中信号 🎈信号产生📕kill…

【分数序列相加】求出一分数序列数列的前20列之和

有一分数序列&#xff1a;1/2,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20列之和 #include<stdio.h>int main(){int t,number20;float a2,b1,s0;for(int i1;i<number;i){ssa/b;ta;aab;bt;}printf("%f\n",s);return 0; } 输出结果&#xff1a; 觉得有帮助…

主存编址例题

知识点 存储单元个数最大地址-最小地址1 存储单元个数BFFFFH-80000H13FFFFH140000H 这是个十六进制&#xff0c;转换为十进制4*16^44*2^4^44*2^164*2^6*2^10字节 1kb1024字节2^10字节 因此可以转换为4*2^6kb256kb 1byte8bit&#xff0c;1个字节8比特 16k*4bit16*1024*0.5…

2024.8.21 作业

一个服务器和两个客户端聊天 代码&#xff1a; /*******************************************/ 文件名&#xff1a;server.c /*******************************************/ #include <myhead.h> #define SER_IP "192.168.2.7" // 服务器IP #define SER…

防火墙的原因导致:Arduino2.x下载安装后卡在LOGO

台式机之前使用arduino1.8没什么问题&#xff0c;升级到2.x后不能用了。由于arduino1.8还是可以能够使用的&#xff0c;关键台式机不是主力就凑合的。主力机笔记本升级arduino2.x能够使用&#xff0c;没有折腾了&#xff0c;这两天有空准备&#xff0c;折腾了一天。终于成果&am…

涂料耐久性氙灯老化试验箱

涂料氙灯老化试验箱是现代检测手段中常用的一种设备&#xff0c;它能够模拟自然光照、光照老化等环境条件&#xff0c;对涂料、染料、塑料、橡胶、纺织品、涂层等材料进行老化试验&#xff0c;以评估其耐久性和使用寿命。本文将详细介绍涂料氙灯老化试验箱的工作原理、使用注意…

MCU扩容新选择——SD NAND(单片机上搭配的SPI NOR FLASH容量告急!)

目录 注意&#xff1a; 前言&#xff1a;  问题与需求&#xff1a; SD NAND方案&#xff1a; NOR 与 NAND的区别&#xff1a; 总结&#xff1a; 插播广告&#xff1a; 128MB 详情页&#xff1a; PS: 传送门&#xff1a; 退路&#xff1a; 传送门; 注意&#xff1a;…

案例分享—优秀国外界面设计配色舒适的原因

国外的UI设计师通常接受过系统的色彩理论学习&#xff0c;他们深刻理解色彩对人的心理和感知的影响。在实际设计中&#xff0c;他们运用这些知识&#xff0c;通过巧妙的色彩搭配来创造出和谐、舒适的视觉效果&#xff0c;从而提升用户体验。 国外的UI设计在色彩搭配上往往更加注…

python中取list前2位

实用工具 list [1,2,3] print(list[:2])结果输出

时间序列分析2|ARIMA模型|SARIMA模型

ARMA模型的定阶 自相关和偏自相关系数法 通过观察样本的自相关系数(ACF)和偏自相关系数(PACF)&#xff0c;进行大体的判断 模型定阶的经验方法 截尾&#xff1a; 最初的d阶样本(偏)自相关系数明显在2倍标准差范围外95%的(偏)自相关系数都落在2倍标准差的范围以内非零自相…

RAM(随机存取存储器)都有哪些?(超详细)

目录 RAM的特点 RAM的类型 1. SRAM&#xff08;静态随机存取存储器&#xff09; 2. DRAM&#xff08;动态随机存取存储器&#xff09; 3. SDRAM&#xff08;同步动态随机存取存储器&#xff09; 4. DDR SDRAM&#xff08;双倍数据速率同步动态随机存取存储器&#xff09;…

GTC2024 回顾 | 优阅达携手 Power BI 赋能企业数据洞察,助力 AI 驱动的商业智能革新

随着 AI 加入&#xff0c;Power BI 更像是一个智能分析伙伴&#xff0c;帮助全球企业在数据驱动的商业世界中取得成功。 GTC 2024 全球流量大会&#xff08;深圳&#xff09;已圆满落幕。作为中国跨境出海领域最大的盛会之一&#xff0c;大会聚焦了行业内最前沿的创新技术和跨境…