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

Java 集合框架:List 体系与实现类深度解析

Java-day13

引入

Java 集合框架是处理“批量数据”的核心工具,其中 **List 体系**以“有序、可重复”的特性,成为日常开发中最常用的集合类型。本文将围绕 List 接口的两大实现类 `ArrayList` 和 `LinkedList`,以及遗留类 `Vector` 展开,从**底层数据结构**、**核心方法**到**适用场景**,全面解析 List 集合的设计逻辑与实战技巧,帮助读者掌握“何时用何集合”的选型能力。

一、Java 集合框架概述

Java 集合框架主要分为四大体系:

- **Set**:无序、不可重复的集合;

- **List**:有序、可重复的集合(本文核心);

- **Map**:具有键值映射关系的集合;

- **Queue**:队列式集合(先进先出)。

其中,**List 是 Collection 接口的子接口**,它保证元素“按插入顺序排序”,支持通过索引直接操作元素,且允许元素重复。

二、ArrayList 集合:基于动态数组的 List 实现

2.1 ArrayList 底层原理与特点

- **数据结构**:内部封装了一个 `Object[]` 类型的**动态数组**,初始长度为 10,当数组容量不足时会**扩容(默认扩容为原容量的 1.5 倍)**;

- **核心特点**:

  - 查询快(基于数组的索引随机访问),增删慢(增删元素需移动数组元素);

  - 线程不安全,执行效率高;

  - 元素类型为 `Object`,支持向上转型(如存储 `Cat`、`Dog` 等子类对象,体现多态)。

2.2 ArrayList 核心方法与实战

```java

import java.util.ArrayList;public class ArrayListDemo {public static void main(String[] args) {// 创建 ArrayList 集合(泛型指定为 String)ArrayList<String> list = new ArrayList<>();// 1. 添加元素:add()list.add("青城");list.add("博雅");System.out.println("添加元素后:" + list); // 输出:[青城, 博雅]// 2. 在指定位置插入元素:add(int index, Object element)list.add(1, "教育");System.out.println("指定位置插入后:" + list); // 输出:[青城, 教育, 博雅]// 3. 获取元素数量:size()System.out.println("元素数量:" + list.size()); // 输出:3// 4. 获取指定索引元素:get(int index)System.out.println("索引1的元素:" + list.get(1)); // 输出:教育// 5. 修改元素:set(int index, Object element)list.set(1, "QC");System.out.println("修改元素后:" + list); // 输出:[青城, QC, 博雅]// 6. 删除指定索引元素:remove(int index)list.remove(2);System.out.println("删除索引2后:" + list); // 输出:[青城, QC]// 7. 删除指定元素:remove(Object element)list.remove("青城");System.out.println("删除元素'青城'后:" + list); // 输出:[QC]// 8. 清空集合:clear()list.clear();System.out.println("清空后是否为空:" + list.isEmpty()); // 输出:true// 9. 遍历集合(三种方式)list.add("A");list.add("B");list.add("C");// 方式1:for 循环 + 索引for (int i = 0; i < list.size(); i++) {System.out.print(list.get(i) + " "); // 输出:A B C}System.out.println();// 方式2:增强 for 循环for (String s : list) {System.out.print(s + " "); // 输出:A B C}System.out.println();// 方式3:迭代器java.util.Iterator<String> it = list.iterator();while (it.hasNext()) {System.out.print(it.next() + " "); // 输出:A B C}}}

```

2.3 ArrayList 适用场景

- 适合**查询操作频繁**、**增删操作较少**的场景(如数据展示、报表导出);

- 不适合多线程环境(需手动加锁或改用 `Vector`)。

三、LinkedList 集合:基于双向链表的 List 实现

3.1 LinkedList 底层原理与特点

- **数据结构**:内部封装了一个**双向链表**,每个节点包含“前驱节点引用”“元素值”“后继节点引用”;

- **核心特点**:

  - 增删快(只需修改节点的引用指向),查询慢(需从链表头/尾遍历);

  - 线程不安全;

  - 除了 List 接口的方法,还提供了**操作链表头尾**的特有方法(如 `addFirst()`、`getLast()` 等)。

3.2 LinkedList 核心方法与实战

```java

import java.util.LinkedList;public class LinkedListDemo {public static void main(String[] args) {// 创建 LinkedList 集合(泛型指定为 Integer)LinkedList<Integer> list = new LinkedList<>();// 1. 添加元素:add()、addFirst()、addLast()list.add(1);list.add(2);list.addFirst(0);list.addLast(3);System.out.println("添加元素后:" + list); // 输出:[0, 1, 2, 3]// 2. 在指定位置插入元素:add(int index, Object element)list.add(2, 9);System.out.println("指定位置插入后:" + list); // 输出:[0, 1, 9, 2, 3]// 3. 获取元素:get(int index)、getFirst()、getLast()System.out.println("索引2的元素:" + list.get(2)); // 输出:9System.out.println("第一个元素:" + list.getFirst()); // 输出:0System.out.println("最后一个元素:" + list.getLast()); // 输出:3// 4. 修改元素:set(int index, Object element)list.set(2, 8);System.out.println("修改元素后:" + list); // 输出:[0, 1, 8, 2, 3]// 5. 删除元素:remove()、remove(int index)、removeFirst()、removeLast()list.remove(); // 删除第一个元素list.remove(2); // 删除索引2的元素System.out.println("删除后:" + list); // 输出:[1, 8, 3]// 6. 清空集合:clear()list.clear();System.out.println("清空后是否为空:" + list.isEmpty()); // 输出:true}}

```

3.3 LinkedList 适用场景

- 适合**增删操作频繁**、**查询操作较少**的场景(如消息队列、历史记录);

- 利用其“链表头尾操作”的特性,可作为**栈(Stack)**或**队列(Queue)**的实现。

---

四、Vector 集合:遗留的线程安全 List 实现

4.1 Vector 底层原理与特点

- **数据结构**:基于**数组**实现,与 `ArrayList` 类似;

- **核心特点**:

  - 线程安全(所有方法加了 `synchronized` 同步锁),执行效率低;

  - 扩容机制为“原容量的 2 倍”(`ArrayList` 是 1.5 倍);

  - 属于 Java 早期遗留类,**不建议在新代码中使用**(可改用 `ArrayList` 加手动锁,或使用 `ConcurrentArrayList`)。

4.2 Vector 核心方法示例

```java

import java.util.Vector;public class VectorDemo {public static void main(String[] args) {// 创建 Vector 集合Vector<String> vector = new Vector<>();// 添加元素vector.add("Apple");vector.addElement("Banana"); // 与 add() 功能类似,为遗留方法System.out.println("添加后:" + vector); // 输出:[Apple, Banana]// 访问元素System.out.println("索引1的元素:" + vector.get(1)); // 输出:BananaSystem.out.println("索引1的元素(遗留方法):" + vector.elementAt(1)); // 输出:Banana// 修改元素vector.set(1, "Cherry");System.out.println("修改后:" + vector); // 输出:[Apple, Cherry]// 删除元素vector.remove(1);vector.removeElement("Apple");System.out.println("删除后:" + vector); // 输出:[]}}

```

五、List 集合选型与对比

集合类底层结构线程安全查询效率增删效率适用场景
ArrayList动态数组不安全查询多、增删少的场景
LinkedList双向链表不安全增删多、查询少的场景
Vector动态数组安全遗留系统维护、多线程(不推荐)

六、总结:List 集合的核心要点

1. **ArrayList**:

   - 基于动态数组,查询快、增删慢,线程不安全;

   - 掌握 `add()`、`get()`、`set()`、`remove()` 等核心方法,以及三种遍历方式。

2. **LinkedList**:

   - 基于双向链表,增删快、查询慢,线程不安全;

   - 除 List 通用方法外,还需掌握 `addFirst()`、`getLast()` 等链表头尾操作方法。

3. **Vector**:

   - 线程安全但效率低,属于遗留类,新代码中尽量避免使用。

4. **选型建议**:

   - 优先考虑 `ArrayList`(性能优、使用广泛);

   - 增删频繁场景选 `LinkedList`;

   - 多线程场景需结合锁机制或改用并发集合(如 `CopyOnWriteArrayList`)。

通过本文的学习,相信你已对 Java List 集合的实现类有了全面理解。在实际开发中,需根据“查询/增删频率”“线程安全需求”等因素选择合适的集合,以达到最优性能。后续文章将解析 Set、Map 等其他集合体系,敬请关注。

http://www.dtcms.com/a/574218.html

相关文章:

  • 阿里云 ip 网站哈尔滨行业网站建设策划
  • 注册了网站怎么建设网站视听内容建设
  • 泉州专业做网站网上做网站怎么防止被骗
  • 使用 ECharts + ECharts-GL 生成 3D 环形图
  • 做电影网站视频放在那里南阳做那个网站好
  • 美德的网站建设局网站建设招标
  • 学校网站的建设论文怎么建网站做推广
  • 第四阶段通讯开发-7:TCPListener和TCPClient
  • 中国最权威的网站排名电脑网站安全证书有问题如何解决
  • 网站建设实训小结在线网站流量查询
  • 深圳网站建设自己人做1688网站到哪里找图片
  • C++ —— list
  • xv6 附录A
  • 【设计题】如何实现一个线程安全的缓存?
  • 网站透明效果wordpress广告插件中文
  • 网站建设费用进会计什么科目界面设计与制作是做什么的
  • 中小企业网站建设如何c 网站开发教程
  • 深度学习-池化层
  • ruoyi-app学习路线
  • 网站群建设意见网站建设+廊坊
  • 数据库关系模式核心概念详解:候选关键字与无损连接判断
  • 做外贸上哪些网站找客户网页设计收费标准
  • 阿里云ALB可编程脚本示例
  • wordpress网站非常慢网站备案协议书
  • Nginx防御HTTP Host头注入漏洞:实战配置漏洞修复教程
  • 南宁手机网站制作公司软件工程学什么课程
  • HTML - 换行标签的 3 种写法(<br>、<br/>、<br />)
  • 做电影网站需要的服务器配置wordpress程序伪静态
  • 是网站建设专业好做如美团式网站要多少钱
  • RPA概念是什么?和AI有哪些区别?