【Java集合进阶】Collection 体系集合详解(ArrayList,LinkedList,HashSet,TreeSet...)

本文详细介绍了Java集合框架中的Collection体系,包括ArrayList、LinkedList、HashSet和TreeSet等实现类,讨论了它们的区别和应用场景。文章阐述了集合与数组的区别,Collection接口的功能,以及List和Set接口的特性。此外,还讲解了ArrayList和LinkedList的增删查改操作,以及Set接口的无序性和不重复性。最后提到了Collections工具类提供的各种集合操作方法。

在这里插入图片描述

1. 概念

集合是对象的容器,定义了多个对对象操作的方法,实现了和数组一样的功能,集合类全部位于java.util.* 包中,使用该类前需要进行导包操作导入相应的 Java 类。

先上脑图:

在这里插入图片描述

那么集合和前面学习的数组有什么区别呢?

2. 集合和数组的区别

集合和数组主要有两个方面的区别,首先是数组的长度是固定的,而集合长度不固定。其次是,数组可以存储基本数据类型和引用数据类型的变量,而集合只能存储引用数据类型的变量。

对于基本数据类型,我们一般进行装箱操作后即可存储在集合中,即把基本数据类型的变量封装成包装类的对象。这也体现了 Java 万物皆对象的特点。

3. 集合的体系结构

Java中封装了很多的集合类,接下类的一段时间,我们就要一起探讨 Java 集合类的学习。由于Java集合类的知识繁杂,所以我们要先了解 Java 集合的体系结构,然后进行深入的学习。

Java集合结构庞大,其主要分为两大类,单列集合 Collection 和双列集合 map。所谓的单列集合是一次只能添加一个数据,而双列集合就是一次可以添加一对数据。

接下来从这两大类开始学习,首先要学习的是单列集合 Collection 体系集合:

### Java 集合框架数据结构动态演示 #### ArrayList 的底层实现与可视化 `ArrayList` 是基于动态数组实现的一种集合容器。当创建 `new ArrayList(22)` 时,其内部会初始化一个长度为 22 的对象数组 `elementData`[^1]。随着元素的增加,如果当前容量不足以容纳新元素,则会触发扩容操作。扩容机制通常是将原数组大小扩展至原来的约 1.5 倍,并复制原有数据到新的数组中。 以下是 `ArrayList` 扩容的过程动态图描述: - 初始状态:`elementData` 数组具有固定初始容量。 - 插入元素:每次调用 `add()` 方法向列表追加元素。 - 容量不足:当达到最大容量时,执行扩容逻辑并重新分配内存空间。 ```java // ArrayList 添加元素示例 List<String> list = new ArrayList<>(2); list.add("A"); list.add("B"); list.add("C"); // 此处可能触发扩容 ``` --- #### LinkedList 的底层实现与可视化 `LinkedList` 实现了双向链表的数据结构。它由一系列节点组成,每个节点包含三个部分:前驱指针 (`prev`)、存储的实际数据 (`data`) 和后继指针 (`next`)。通过这些指针可以快速访问前后相邻节点。 下面是 `LinkedList` 的基本操作动态展示: - **插入头结点**:新增节点成为第一个节点,更新旧头部的前驱指向新节点。 - **尾部追加**:在最后一个节点之后添加新节点,并调整最后节点的后继指针。 - **删除中间节点**:修改目标节点两侧邻居之间的连接关系。 ```java // LinkedList 操作示例 Deque<Integer> deque = new LinkedList<>(); deque.offerFirst(1); // 头插法 deque.offerLast(3); // 尾插法 deque.poll(); // 删除队首元素 ``` --- #### HashSet 的底层实现与可视化 `HashSet` 使用哈希表作为其实现方式,具体来说它是基于 `HashMap` 构建而成[^3]。每当往 `HashSet` 中加入一个元素时,实际上是在对应的 `HashMap` 中存入键值对 `(key, PRESENT)`,其中 `PRESENT` 是一个固定的虚拟值。 由于采用了散列函数定位存储位置,因此查找效率极高(平均时间复杂度 O(1))。然而,在发生冲突的情况下可能会退化成线性探测或者拉链法处理。 下面展示了如何构建以及维护 `HashSet` 结构: ```java // HashSet 示例代码 Set<String> set = new HashSet<>(); set.add("Apple"); set.add("Banana"); boolean containsGrape = set.contains("Grape"); // 查找是否存在指定项 ``` --- #### TreeSet 的底层实现与可视化 不同于无序的 `HashSet`,`TreeSet` 提供了一种有序排列的功能,这得益于红黑树这种自平衡二叉搜索树的支持。所有插入进去的对象都会按照自然顺序或定制化的比较器来进行排序。 对于每一次插入动作而言,程序都需要沿着路径找到合适的位置并将该节点挂载上去;与此同时还要保持整棵树处于平衡状态以确保性能稳定。 ```java // TreeSet 示例代码 NavigableSet<Double> sortedNumbers = new TreeSet<>(); sortedNumbers.addAll(Arrays.asList(78d, 90d, 65d)); double ceilingValue = sortedNumbers.ceiling(70d); // 获取大于等于给定数的第一个成员 ``` --- ### 总结 上述四种集合各有特点适用于不同场景需求下解决问题。理解它们背后的工作原理有助于开发者更高效合理地选用工具完成任务。
评论 59
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橙 子_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值