当前位置: 首页 > news >正文

详细介绍:Java集合框架概述

目录

1、概念

2、核心体系结构

3、Collection接口及实现

3.1 List接口(有序)

3.2 Set接口(去重)

3.3 Queue接口(队列)

4、Map接口及实现

5、迭代器和工具类

5.1 迭代器 (Iterator)

5.2 比较器(Comparator)

5.3 工具类(Collections)

6、集合选择


1、概念

Java集合框架是一个统一的架构,用于表示和操作集合。它包含:

  1. 接口:代表不同类型的集合,如 ListSetMap,它们定义了集合的基本操作。

  2. 实现:这些接口的具体实现类,通常是可复用的数据结构,如 ArrayListHashSetHashMap

  3. 算法:对集合执行有用操作的方法,如搜索和排序。这些算法被称为多态的,因为同一个方法可以在不同的接口实现上工作。

核心设计思想:通过接口和实现分离,可以只关注接口编程,而无需关心底层具体的数据结构,从而提高了代码的灵活性和可维护性。

2、核心体系结构

Java集合框架主要分为两大派系:Collection 和 Map

Collection (单列集合):存储一组独立的元素。它有三个主要的子接口

  • List有序、可重复 的集合。典型实现:ArrayListLinkedListVector

  • Set无序、不可重复 的集合。典型实现:HashSetLinkedHashSetTreeSet

  • Queue队列,模拟了队列数据结构,通常是“先进先出”(FIFO)。典型实现:LinkedListPriorityQueueArrayDeque

Map (双列集合):存储键值对 的集合。每个元素都包含一个键和一个值,键不可重复。典型实现:HashMapLinkedHashMapTreeMapHashtable

3、Collection接口及实现

3.1 List接口(有序)

对比维度ArrayListLinkedListVector(不推荐)
底层原理动态数组双向链表动态数组
数据存储Object[] elementData节点 Node<E>(含itemprevnextObject[] elementData
主要特点随机访问快(O(1)),尾部操作快;增删慢(需移动元素,O(n)),非线程安全增删快(尤其头尾,O(1)),可作栈、队列、双端队列;随机访问慢(需遍历,O(n)),非线程安全类似ArrayList,但线程安全,多数方法使用synchronized关键字修饰,性能通常低于ArrayList
扩缩容机制默认初始容量10,按约1.5倍oldCapacity + (oldCapacity >> 1))自动扩容,并将旧数据拷贝过去,可手动ensureCapacity无固定初始容量,无需扩容,新增元素时动态创建节点默认初始容量10,可按指定容量增量自动扩容,未指定时默认增长为原来的2倍oldCapacity * 2
线程安全实现非线程安全,多线程下可用 Collections.synchronizedList(new ArrayList(...)) 包装非线程安全,多线程下可用 Collections.synchronizedList(new LinkedList(...)) 包装线程安全,通过在方法上使用 synchronized 实现

参考:

Java:ArrayList的使用

Java:LinkedList的使用

3.2 Set接口(去重)

对比维度HashSetLinkedHashSetTreeSet
底层原理基于 HashMap 实现继承自 HashSet,基于 LinkedHashMap 实现基于 TreeMap 实现(红黑树)
数据存储HashMap(数组+链表/红黑树)LinkedHashMap(数组+链表+双向链表)TreeMap(红黑树)
元素顺序无序插入顺序 或 访问顺序自然顺序 或 Comparator 定制顺序
主要特点查询最快 O(1),元素唯一性基于 hashCode() 和 equals(),允许 null 元素保持插入顺序,迭代性能好,元素唯一性同 HashSet自动排序,支持范围查询,元素唯一性基于 compareTo() 或 compare()
时间复杂度添加、删除、查询平均 O(1)添加、删除、查询平均 O(1)添加、删除、查询 O(log n)
扩缩容机制同 HashMap,默认初始容量16,负载因子0.75,2倍扩容同 LinkedHashMap,默认初始容量16,负载因子0.75,2倍扩容无固定容量概念,按红黑树节点动态调整
线程安全实现非线程安全非线程安全非线程安全
null 元素支持允许一个 null允许一个 null不允许 null(除非自定义 Comparator)

线程安全:

  • 对于非线程安全的 Set,可以通过 Collections.synchronizedSet() 进行包装

  • 在并发场景下还有其他选择,如 ConcurrentSkipListSet(基于跳表的并发有序 Set)

元素唯一性实现

  • HashSet/LinkedHashSet 依赖 hashCode() 和 equals() 方法

  • TreeSet 依赖 compareTo() 或 compare() 方法(返回0视为相等)

参考:

Java:HashSet的使用

Java:TreeSet的使用

3.3 Queue接口(队列)

对比维度LinkedListPriorityQueueArrayDeque
底层原理双向链表二叉堆(最小堆,基于数组)循环数组
数据存储Node节点(item, prev, next)Object[] queueObject[] elements
元素顺序FIFO(队列)或 LIFO(栈)按优先级(自然顺序或 Comparator)FIFO(队列)或 LIFO(栈)
主要特点功能灵活,可作List/Deque/Queue,增删快,查询慢元素按优先级出队,不支持null元素,入队出队O(log n)性能优于LinkedList,内存连续,缓存友好,不能存储null
边界特性无界无界无界(但初始容量固定)
线程安全非线程安全非线程安全非线程安全
扩缩容机制无固定容量,动态创建节点默认初始容量11,按 oldCapacity + (oldCapacity < 64 ? oldCapacity + 2 : oldCapacity >> 1) 扩容最小容量8,按2的幂次扩容(通常翻倍)
时间复杂度入队/出队 O(1),随机访问 O(n)入队 O(log n),出队 O(log n),查看队首 O(1)入队/出队 O(1)
null元素允许不允许不允许
迭代顺序插入顺序优先级顺序(堆排序)插入顺序
内存占用较高(每个元素需要额外指针)较低(数组存储)最低(数组存储,无指针开销)

线程安全:

  • 对于非线程安全的 Queue,可以通过 Collections.synchronizedSet() 进行包装

  • 在并发场景下还有其他选择,如 ConcurrentLinkedDeque(无界,非阻塞,高并发性能好)、LinkedBlockingDeque(可选有界,阻塞操作,吞吐量高)

4、Map接口及实现

特性HashMapLinkedHashMapTreeMapConcurrentHashMap
数据结构数组+链表/红黑树继承HashMap,并增加双向链表红黑树JDK8+:数组+链表/红黑树 + CAS + synchronized
是否有序不保证顺序插入顺序访问顺序键的自然顺序Comparator定制顺序不保证顺序
键值Null支持Key和Value均允许一个nullKey和Value均允许一个null (继承HashMap)Key和Value均不允许为nullKey和Value均不允许为null
线程安全非安全,需外部同步非安全,需外部同步非安全,需外部同步安全,使用锁分段技术或CAS
扩容机制默认容量16,负载因子0.75;超出阈值(容量*负载因子)时2倍扩容同HashMap基于树结构调整,无需传统扩容类似HashMap,但支持并发扩容
性能特点访问最快,取决于hash函数比HashMap稍慢,因维护链表增删改查 O(log n),因树结构高并发下性能远优于Hashtable

参考:

Java:HashMap的使用

5、迭代器和工具类

5.1 迭代器 (Iterator)

所有集合都提供了迭代器,用于遍历集合中的元素。它是一种设计模式,将遍历逻辑与集合本身分离。

List list = Arrays.asList("A", "B", "C");
Iterator iterator = list.iterator();
while (iterator.hasNext()) {String element = iterator.next();System.out.println(element);// 可以在遍历中使用 iterator.remove() 安全地删除元素
}
// 增强for循环 (foreach) 底层就是使用了迭代器
for (String s : list) {System.out.println(s);
}

5.2 比较器(Comparator)

Comparator是Java中的一个函数式接口,位于java.util包中。它用于定义对象的定制排序规则,允许在不修改原始类的情况下,为类对象提供多种不同的比较方式。

返回值规则:

  • 负数 (< 0):当前对象 小于 参数对象

  •  (= 0):当前对象 等于 参数对象

  • 正数 (> 0):当前对象 大于 参数对象

// Comparator使用示例 - 按分数排序
Comparator byScore = new Comparator() {@Overridepublic int compare(Student s1, Student s2) {return Double.compare(s1.getScore(), s2.getScore());}
};
Collections.sort(students, byScore);  // 使用Comparator而不是自然排序
// 使用Lambda表达式按分数降序排序
students.sort((s1, s2) -> Double.compare(s2.getScore(), s1.getScore()));
// 使用Comparator.comparing静态工厂方法,按姓名排序
students.sort(Comparator.comparing(Student::getName));
// 多级排序:先按年龄升序,再按分数降序
Comparator complexComparator =Comparator.comparing(Student::getAge)           // 第一级:年龄升序.thenComparing(Comparator.comparing(Student::getScore).reversed()  // 第二级:分数降序);
students.sort(complexComparator);
// 处理null值:将null放在最后
Comparator nullsLastComparator = Comparator.nullsLast(Comparator.comparing(Student::getName));
// 自定义逻辑:优秀学生(分数>=90)优先,然后按年龄排序
Comparator customComparator = (s1, s2) -> {boolean s1Excellent = s1.getScore() >= 90;boolean s2Excellent = s2.getScore() >= 90;if (s1Excellent && !s2Excellent) {return -1; // s1排在s2前面} else if (!s1Excellent && s2Excellent) {return 1;  // s1排在s2后面} else {// 都是优秀或都不是优秀,按年龄排序return Integer.compare(s1.getAge(), s2.getAge());}
};
students.sort(customComparator);

5.3 工具类(Collections)

Collections 类提供了大量静态方法,用于操作或返回集合,非常实用。

  • 排序Collections.sort(list)

  • 打乱Collections.shuffle(list)

  • 反转Collections.reverse(list)

  • 查找最大值/最小值Collections.max(collection)Collections.min(collection)

  • 线程安全包装Collections.synchronizedList(list)Collections.synchronizedMap(map)(性能不如 ConcurrentHashMap 等并发集合)

List numbers = new ArrayList<>(Arrays.asList(3, 1, 4, 1, 5, 9));
Collections.sort(numbers); // 排序
System.out.println(numbers); // 输出: [1, 1, 3, 4, 5, 9]
Collections.shuffle(numbers); // 打乱
System.out.println(numbers); // 输出: [5, 1, 9, 3, 1, 4] (随机)
List syncList = Collections.synchronizedList(numbers); // 获取线程安全的List

6、集合选择

场景首选接口实现类选择
需要根据索引快速查询ListArrayList
需要频繁在中间插入、删除ListLinkedList
需要元素唯一,不关心顺序SetHashSet
需要元素唯一,且保持插入顺序SetLinkedHashSet
需要元素唯一,且需要排序SetTreeSet
存储键值对,需要快速存取MapHashMap
存储键值对,需要按插入/访问顺序MapLinkedHashMap
存储键值对,需要Key排序MapTreeMap
需要队列或栈功能Queue/DequeArrayDequeLinkedList
需要多线程环境下的高性能集合-使用 java.util.concurrent 包下的类,如 ConcurrentHashMapCopyOnWriteArrayList

http://www.jsqmd.com/news/88262/

相关文章:

  • 瑞萨推出M33内核WiFi6双频(2.4G+5G) + BLE蓝牙芯片RA6W2/W1,同时还将推出现成模组
  • 修改kubuntu下matlab2025b系统界面的大小
  • 基于SSM的高校大学生就业平台的设计与实现(开题报告)
  • 6、RSEI 生态环境质量智能评估系统 (GEE App)
  • 基于vue的酒店管理系统_tfdib7x1_springboot php python nodejs
  • Diffusion Policy详解
  • 基于python+django的学生就业管理的招聘系统(源码+lw+部署文档+讲解等)
  • 基于VFNet的安全装备检测系统Python实现(含代码+模型解析)
  • 基于springboot和vue的Script的线上超市团购系统的设计与实现_kvoptnlt(java毕业设计项目源码)
  • 将NeMo模型转换为Triton兼容格式
  • JavaDataStructure预备知识
  • 经典算法题详解之统计重复个数(三)
  • 打卡信奥刷题(2536)用C++实现信奥 P2044 [NOI2012] 随机数生成器
  • 基于springboot和vue的人脸识别的无人值守自习室预约签到系统的设计与实现_4s9zffod(java毕业设计项目源码)
  • 树的初阶相关知识(中)
  • 力扣 打家劫舍
  • Windows系统wfdprov.dll文件损坏 下载修复
  • 基于springboot和vue的协同办公系统 企业员工请假销假系统_c27myh05(java毕业设计项目源码)
  • 【3D图像技术分析与实现】Apple Vision Pro三维成像技术栈深度解析
  • 力扣 完全平方数
  • python3
  • 基于springboot和vue的城市公交管理系统的设计与实现_8f8dpq62(java毕业设计项目源码)
  • shell 判断二进制是否可用
  • Flask安装与第一个应用 路由系统
  • Triton推理服务器部署微调后的模型及测试
  • 树的初阶相关知识(上)
  • 基于springboot和vue的大学生课程排课管理系统设计_2ux3bmwb(java毕业设计项目源码)
  • 基于springboot和vue的扫码解锁共享单车管理系统设计与实现_0455qudf(java毕业设计项目源码)
  • 2025年成都靠谱的抖音代运营品牌哪家好,网站建设/网络公关/网络推广/新闻营销/抖音推广/抖音代运营品牌推荐排行榜 - 品牌推荐师
  • 云数据库服务(如AWS RDS)的优势和考虑因素?