Java集合框架概述Java:ArrayList的使用Java:LinkedList的使用Java:HashSet的使用Java:TreeSet的使用Java:HashMap的使用

作者:熙客日期:2025/11/19

目录

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. 接口:代表不同类型的集合,如 List, Set, Map,它们定义了集合的基本操作。
  2. 实现:这些接口的具体实现类,通常是可复用的数据结构,如 ArrayList, HashSet, HashMap
  3. 算法:对集合执行有用操作的方法,如搜索和排序。这些算法被称为多态的,因为同一个方法可以在不同的接口实现上工作。

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

2、核心体系结构

Java集合框架主要分为两大派系:CollectionMap

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

  • List有序、可重复 的集合。典型实现:ArrayList, LinkedList, Vector
  • Set无序、不可重复 的集合。典型实现:HashSet, LinkedHashSet, TreeSet
  • Queue队列,模拟了队列数据结构,通常是“先进先出”(FIFO)。典型实现:LinkedList, PriorityQueue, ArrayDeque

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

3、Collection接口及实现

3.1 List接口(有序)

对比维度ArrayListLinkedListVector(不推荐)
底层原理动态数组双向链表动态数组
数据存储Object[] elementData节点 Node<E>(含item, prev, next)Object[] 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)

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

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

5.2 比较器(Comparator)

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

返回值规则:

  • 负数 (< 0):当前对象 小于 参数对象
  • (= 0):当前对象 等于 参数对象
  • 正数 (> 0):当前对象 大于 参数对象
1// Comparator使用示例 - 按分数排序
2Comparator<Student> byScore = new Comparator<Student>() {
3    @Override
4    public int compare(Student s1, Student s2) {
5        return Double.compare(s1.getScore(), s2.getScore());
6    }
7};
8
9Collections.sort(students, byScore);  // 使用Comparator而不是自然排序
10
11// 使用Lambda表达式按分数降序排序
12students.sort((s1, s2) -> Double.compare(s2.getScore(), s1.getScore()));
13
14// 使用Comparator.comparing静态工厂方法,按姓名排序
15students.sort(Comparator.comparing(Student::getName));
16
17// 多级排序:先按年龄升序,再按分数降序
18Comparator<Student> complexComparator = 
19   Comparator.comparing(Student::getAge)           // 第一级:年龄升序
20              .thenComparing(
21                   Comparator.comparing(Student::getScore).reversed()  // 第二级:分数降序
22                );
23students.sort(complexComparator);
24
25// 处理null值:将null放在最后
26Comparator<Student> nullsLastComparator = Comparator.nullsLast(Comparator.comparing(Student::getName));
27
28// 自定义逻辑:优秀学生(分数>=90)优先,然后按年龄排序
29Comparator<Student> customComparator = (s1, s2) -> {
30      boolean s1Excellent = s1.getScore() >= 90;
31      boolean s2Excellent = s2.getScore() >= 90;
32            
33      if (s1Excellent && !s2Excellent) {
34            return -1; // s1排在s2前面
35      } else if (!s1Excellent && s2Excellent) {
36            return 1;  // s1排在s2后面
37      } else {
38            // 都是优秀或都不是优秀,按年龄排序
39            return Integer.compare(s1.getAge(), s2.getAge());
40      }
41};
42students.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 等并发集合)
1List<Integer> numbers = new ArrayList<>(Arrays.asList(3, 1, 4, 1, 5, 9));
2Collections.sort(numbers); // 排序
3System.out.println(numbers); // 输出: [1, 1, 3, 4, 5, 9]
4
5Collections.shuffle(numbers); // 打乱
6System.out.println(numbers); // 输出: [5, 1, 9, 3, 1, 4] (随机)
7
8List<Integer> syncList = Collections.synchronizedList(numbers); // 获取线程安全的List

6、集合选择

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

Java集合框架概述Java:ArrayList的使用Java:LinkedList的使用Java:HashSet的使用Java:TreeSet的使用Java:HashMap的使用》 是转载文章,点击查看原文


相关推荐


Python 的内置函数 str
IMPYLH2025/11/17

Python 内建函数列表 > Python 的内置函数 str Python 的内置函数 str() 是一个非常重要的类型转换函数,用于将其他数据类型转换为字符串类型。它在 Python 编程中有广泛的应用场景,下面详细介绍其功能和用法: 基本功能 str() 函数的主要作用是将给定的对象转换为字符串表示形式。当调用 str() 时,它会尝试调用对象的 __str__() 方法(如果存在)来获取其字符串表示。 语法格式 str(object='', encoding='utf-8',


PC微信协议之AES-192-GCM算法
AiXed2025/11/16

from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes from cryptography.hazmat.primitives import constant_time from cryptography.hazmat.backends import default_backend import os import binascii # ============================


Lua 的简介与环境配置
hubenchang05152025/11/15

#Lua 的简介与环境配置 Lua 是一个简洁、轻量、可扩展的脚本语言;有着相对简单的 C 语言 API,因而而很容易嵌入应用中。很多应用程序使用 Lua 作为自己的嵌入式脚本语言,以此来实现可配置性、可扩展性。 #安装 Lua Lua 官方仅以源码形式进行发布,因为其使用纯 ISO C 实现,编译非常轻松。 首先从 Lua 的官方网站 下载源码,以下是部分历史版本的下载链接: Lua 版本发布日期哈希值(sha256)lua-5.4.82025-05-214f18ddae154e793e46e


【AI应用探索】-10- Cursor实战:小程序&APP - 下
bblb2025/11/14

【AI应用探索】-10- Cursor实战:小程序&APP - 下 1 开发商城微信小程序1.1 微信小程序发布流程准备1.2 Cursor需求设计1.3 数据库准备1.4 生成对应代码1.4.1 小程序前端1.4.2 小程序后端API1.4.3 商家后端 2 开发安卓APP2.1 创建项目2.2 Cursor介入2.3 源码开放 1 开发商城微信小程序 1.1 微信小程序发布流程准备 因为我之前开发过微信小程序,所以上一个小程序的信息还在这里留存着,所以有这些信息


flutter项目老是卡在Running Gradle task ‘assembleRelease‘......
Sindyue2025/11/13

调试开发: 1. adb logcat | grep "tag flutter" 2. flutter clean flutter run --verbose 可以看到下载卡在哪里了 Set environment variables set PUB_HOSTED_URL=https://pub.flutter-io.cn set FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn Then run your Flutter com


Python 的内置函数 hex
IMPYLH2025/11/11

Python 内建函数列表 > Python 的内置函数 hex Python 的内置函数 hex() 用于将一个整数转换为以 “0x” 为前缀的小写十六进制字符串。该函数接受一个整数作为参数,并返回对应的十六进制字符串表示。 详细说明 函数语法: hex(x) x:必须是一个整数对象(可以是 Python 的 int 类型,或者实现了 __index__() 方法的自定义对象) 返回值: 返回字符串类型,格式为 "0x" 开头,后面跟随十六进制数字(a-f 使用小写字母


C++ 图片加背景音乐的处理
laocooon5238578862025/11/9

//music_manager.h #pragma once // 播放背景音乐 void playBackgroundMusic(const char* music, bool repeat = false, int volume = -1); // 暂停当前播放的音乐 void pauseBackgroundMusic(); // 恢复暂停的音乐 void resumeBackgroundMusic(); // 停止并关闭当前音乐 void stopBackgroundMusic()


让数据库“听懂“人话:Text2Sql.Net 深度技术解析
许泽宇的技术分享2025/11/6

从自然语言到SQL的智能转换之旅——基于.NET与Semantic Kernel的企业级实践 📖 引言:当AI遇见数据库 想象一下这样的场景:产品经理走到你面前说"帮我查一下上个月销售额最高的前10个产品",你不用打开SQL客户端,不用回忆表结构,甚至不用写一行代码,只需要把这句话原封不动地"告诉"数据库,几秒钟后,结果就呈现在眼前。 这不是科幻,这就是 Text2Sql.Net 正在做的事情。 在数据驱动的时代,SQL依然是连接人与数据的桥梁。但让我们面对现实:不是每个人都会


Redis(98) Redis的安全更新如何进行?
Victor3562025/11/2

保持Redis的安全更新至关重要,以防止潜在的安全漏洞和攻击。以下是详细的Redis安全更新步骤和相关代码示例。 1. 检查当前Redis版本 首先,检查当前安装的Redis版本。 redis-server --version 或通过Redis CLI: redis-cli info server | grep redis_version 2. 备份Redis数据 在进行任何更新之前,务必备份Redis数据,以防止数据丢失。 手动触发RDB快照 redis-cli BGSAVE 备份RDB


Python 的内置函数 eval
IMPYLH2025/10/30

Python 内建函数列表 > Python 的内置函数 eval Python 的内置函数 eval() 是一个强大的功能函数,用于执行动态生成的 Python 表达式。它的完整语法是: eval(expression, globals=None, locals=None) 其中: expression 是必需参数,表示要执行的字符串形式的 Python 表达式globals 是可选的全局变量字典locals 是可选的局部变量字典 示例: x = 10 result = eval

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0