Java 23 集合框架详解:ArrayList、LinkedList、Vector

news2025/1/8 20:21:54

📚 Java 23 集合框架详解:ArrayListLinkedListVector

在 Java 集合框架中,ArrayListLinkedListVector 是三种最常用的 List 接口实现类。它们都可以存储有序的、可重复的元素,但它们在 底层实现性能多线程安全 等方面存在显著差异。

本文将从 使用案例优化方案多线程优化 等方面详细解析这三种集合的实现原理及适用场景。


📖 1. ArrayListLinkedListVector 概述

集合类型底层实现线程安全性能特点适用场景
ArrayList动态数组读操作快,增删操作慢适合 读操作频繁 的场景
LinkedList双向链表插入/删除操作快,随机访问慢适合 插入/删除操作频繁 的场景
Vector动态数组(线程安全)同步开销大,性能较低适合 多线程环境,但不推荐使用

🧩 2. ArrayList 详解

2.1 特点

  • 基于动态数组实现,初始容量为 10,容量不足时会自动扩容。
  • 支持随机访问get()set() 操作时间复杂度为 O(1)
  • 线程不安全,需要在多线程环境中手动同步。

🔧 2.2 使用案例

import java.util.ArrayList;

public class ArrayListExample {
    public static void main(String[] args) {
        // 创建一个 ArrayList
        ArrayList<String> names = new ArrayList<>();
        names.add("Alice");
        names.add("Bob");
        names.add("Charlie");

        // 遍历
        names.forEach(System.out::println);

        // 获取元素
        System.out.println("First Element: " + names.get(0));

        // 修改元素
        names.set(1, "David");

        // 删除元素
        names.remove("Charlie");

        // 遍历
        names.forEach(System.out::println);
    }
}

🛠 2.3 优化方案

  1. 指定初始容量,减少扩容开销:
    ArrayList<String> list = new ArrayList<>(100);
    
  2. 避免频繁删除或插入操作,如果有大量插入/删除操作,建议使用 LinkedList

⚠️ 2.4 多线程优化

  • ArrayList 是线程不安全的,可以通过以下方式实现线程安全:
方案 1:使用 Collections.synchronizedList()
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class SynchronizedArrayListExample {
    public static void main(String[] args) {
        List<String> synchronizedList = Collections.synchronizedList(new ArrayList<>());

        synchronizedList.add("Alice");
        synchronizedList.add("Bob");

        synchronized (synchronizedList) {
            synchronizedList.forEach(System.out::println);
        }
    }
}
方案 2:使用 CopyOnWriteArrayList
import java.util.concurrent.CopyOnWriteArrayList;

public class CopyOnWriteArrayListExample {
    public static void main(String[] args) {
        CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();

        list.add("Alice");
        list.add("Bob");

        list.forEach(System.out::println);
    }
}

🧩 3. LinkedList 详解

3.1 特点

  • 基于双向链表实现,每个节点包含 数据和两个指针
  • 插入和删除操作快,但随机访问性能较差。
  • 支持双端队列(Deque)操作,可用作 队列(Queue)栈(Stack)

🔧 3.2 使用案例

import java.util.LinkedList;

public class LinkedListExample {
    public static void main(String[] args) {
        // 创建一个 LinkedList
        LinkedList<String> list = new LinkedList<>();
        list.add("Alice");
        list.add("Bob");
        list.add("Charlie");

        // 添加到头部和尾部
        list.addFirst("First");
        list.addLast("Last");

        // 获取头部和尾部元素
        System.out.println("First Element: " + list.getFirst());
        System.out.println("Last Element: " + list.getLast());

        // 删除头部和尾部元素
        list.removeFirst();
        list.removeLast();

        // 遍历
        list.forEach(System.out::println);
    }
}

🛠 3.3 优化方案

  1. 避免随机访问,因为 get() 操作的时间复杂度为 O(n)
  2. 优先使用 ArrayList,除非有大量的插入/删除操作。

⚠️ 3.4 多线程优化

  • LinkedList 是线程不安全的,在多线程环境中需要手动同步。
方案:使用 Collections.synchronizedList()
import java.util.LinkedList;
import java.util.Collections;
import java.util.List;

public class SynchronizedLinkedListExample {
    public static void main(String[] args) {
        List<String> synchronizedList = Collections.synchronizedList(new LinkedList<>());

        synchronizedList.add("Alice");
        synchronizedList.add("Bob");

        synchronized (synchronizedList) {
            synchronizedList.forEach(System.out::println);
        }
    }
}

🧩 4. Vector 详解

4.1 特点

  • 线程安全的动态数组,所有方法都使用了 synchronized 关键字。
  • 性能较低,因为同步开销大。
  • 不推荐使用,在多线程环境下建议使用 CopyOnWriteArrayList

🔧 4.2 使用案例

import java.util.Vector;

public class VectorExample {
    public static void main(String[] args) {
        // 创建一个 Vector
        Vector<String> vector = new Vector<>();
        vector.add("Alice");
        vector.add("Bob");
        vector.add("Charlie");

        // 遍历
        vector.forEach(System.out::println);

        // 获取元素
        System.out.println("First Element: " + vector.get(0));

        // 修改元素
        vector.set(1, "David");

        // 删除元素
        vector.remove("Charlie");

        // 遍历
        vector.forEach(System.out::println);
    }
}

🛠 4.3 优化方案

  1. 避免使用 Vector,改用 ArrayListCopyOnWriteArrayList
  2. 如果必须使用线程安全的集合,推荐使用 CopyOnWriteArrayList

🔄 5. 三者对比总结

特性ArrayListLinkedListVector
底层实现动态数组双向链表动态数组
线程安全
随机访问性能
插入/删除性能
适用场景读操作频繁插入/删除操作频繁多线程环境(不推荐)

⚙️ 6. 总结与推荐

  1. ArrayList 是最常用的集合类,适用于 读操作频繁 的场景。
  2. LinkedList 适用于 插入/删除操作频繁 的场景。
  3. Vector 是线程安全的集合,但 不推荐使用,可用 CopyOnWriteArrayList 替代。

在实际开发中,推荐选择 ArrayListCopyOnWriteArrayList

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

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

相关文章

win10 VS2019上libtorch库配置过程

win10 VS2019上libtorch库配置过程 0 引言1 获取libtorch2 在VS上配置使用libtorch库3 结语 0 引言 &#x1f4bb;&#x1f4bb;AI一下&#x1f4bb;&#x1f4bb;   libtorch库是一个用于深度学习的C库&#xff0c;是PyTorch的官方C前端。它提供了用于构建和训练深度学习模…

Windows 环境配置 HTTPS 服务实战

一、 环境准备 win10以上操作系统安装 Certbot申请阿里云\腾讯云域名安装 nginx 1.3以上版本 二、Certbot 安装及 SSL 证书生成 Certbot 是一个免费、开源工具&#xff0c;用于自动化在Web服务器上获取和更新SSL/TLS证书。它可以通过Let’s Encrypt服务获取免费的SSL/TLS证书…

【C++数据结构——图】最小生成树(头歌实践教学平台习题) 【合集】

目录&#x1f60b; 任务描述 相关知识 带权无向图 建立邻接矩阵 Prim算法 1. 算法基本概念 2. 算法背景与目标 3. 算法具体步骤 4. 算法结束条件与结果 测试说明 通关代码 测试结果 任务描述 本关任务&#xff1a;编写一个程序求图的最小生成树。 相关知识 为了完成…

11.认识异常

本节目标 1.异常概念与体系结构 2.异常的处理方式 3.异常的处理流程 4.自定义异常类 1.异常的概念与体系结构 1.1异常的概念 在Java中,将程序执行过程中发生的不正常行为称为异常,比如: 1.算术异常 System.out.println(10/0);//执行结果 Exception in thread "mai…

基于海思soc的智能产品开发(camera sensor的两种接口)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 对于嵌入式开发设备来说&#xff0c;除了图像显示&#xff0c;图像输入也是很重要的一部分。说到图像输入&#xff0c;就不得不提到camera。目前ca…

vulnhub靶场-potato(至获取shell)

arp-scan -l 扫描IP 使用御剑端口扫描扫描端口&#xff0c;扫到了80和7120两个端口&#xff0c;其中7120为ssh端口 使用dirb http://192.168.171.134 扫描目录 发现info.php 访问为phpinfo界面 访问192.168.171.134为一个大土豆&#xff0c;没什么用 所以我们从ssh入手 盲…

Flutter:邀请海报,Widget转图片,保存相册

记录下&#xff0c;把页面红色区域内的内容&#xff0c;转成图片后保存到相册的功能 依赖 # 生成二维码 qr_flutter: ^4.1.0 # 保存图片 image_gallery_saver_plus: ^3.0.5view import package:demo/common/index.dart; import package:ducafe_ui_core/ducafe_ui_core.dart; i…

Milvus×合邦电力:向量数据库如何提升15%电价预测精度

01. 全球能源市场化改革下的合邦电力 在全球能源转型和市场化改革的大背景下&#xff0c;电力交易市场正逐渐成为优化资源配置、提升系统效率的关键平台。电力交易通过市场化手段&#xff0c;促进了电力资源的有效分配&#xff0c;为电力行业的可持续发展提供了动力。 合邦电力…

网络层协议之IP数据包层分片随笔

1.全篇内容均在图中&#xff0c;如何分片以及分片举例细节拆解&#xff0c;见下图: 1.1分片公式&#xff1a; 上述公式中有关/8 再*8目的是为了使用8字节对齐&#xff0c;从而使的分片数据包均为8字节整数倍&#xff01; 1.2.ip层数据包分片计算&图解

TDengine + MQTT :车联网时序数据库如何高效接入

现代新能源汽车&#xff0c;作为一种内部系统极为复杂的交通工具&#xff0c;配备了大量传感器、导航设备、应用软件&#xff0c;这些传感器产生的数据都需要上报到车联网平台当中。对于这些车辆的状态数据&#xff08;如车速、发动机转速等&#xff09;、位置数据&#xff08;…

jenkins入门3 --执行一个小demo

1、新建视图 视图可以理解为是item的集合&#xff0c;这样可以将item分类。新建视频可以选择加入已有的item 2、新建item 1)输入任务名称、选择一个类型&#xff0c;常用的是第一个freestyle project 2&#xff09;进行item相关配置&#xff0c;general 设置项目名字,描述,参数…

【Vue.js】监听器功能(EventListener)的实际应用【合集】

目录 &#x1f914;在实际开发过程中&#xff0c;我遇到了一个颇为棘手的小问题 &#x1f60b;解决这个小问题 问题出现的原因剖析 解决方法阐述 问题成功解决&#xff01;​ &#x1f4d6;相关知识总结 基本概念 使用方法 实际应用场景 &#x1f914;在实际开发过程中…

【C++数据结构——线性表】顺序表的基本运算(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 一、线性表的基本概念 二、初始化线性表 三、销毁线性表 四、判定是否为空表 五、求线性表的长度 六、输出线性表 七、求线性表中某个数据元素值 八、按元素值查找 九、插入数据元素 十、删除数据元素 测试说明 通关代码 测…

【C++数据结构——查找】二分查找(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 一、根据键盘输入的一组有序数据建立顺序表 二、顺序表的输出 三、二分查找算法 测试说明 通关代码 测试结果 任务描述 本关任务&#xff1a;实现二分查找的算法。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a; …

20250103在Ubuntu20.04.5的Android Studio 2024.2.1.12中跑通Hello World

20250103在Ubuntu20.04.5的Android Studio 2024.2.1.12中跑通Hello World 2025/1/3 14:06 百度&#xff1a;android studio helloworld android studio hello world kotlin helloword kotlin 串口 no run configurations added android studio no run configurations added 1、…

卸载干净 IDEA(图文讲解)

目录 1、卸载 IDEA 程序 2、注册表清理 3、残留清理 1、卸载 IDEA 程序 点击屏幕左下角 Windows 图标 -> 设置-控制面板->intellij idea 勾选第一栏 Delete IntelliJ IDEA 2022.2 caches and local history&#xff0c;表示同时删除 IDEA 本地缓存以及历史。 Delete I…

【HarmonyOS】鸿蒙应用实现屏幕录制详解和源码

【HarmonyOS】鸿蒙应用实现屏幕录制详解和源码 一、前言 官方文档关于屏幕录制的API和示例介绍获取简单和突兀。使用起来会让上手程度变高。所以特意开篇文章&#xff0c;讲解屏幕录制的使用。官方文档参见&#xff1a;使用AVScreenCaptureRecorder录屏写文件(ArkTS) 二、方…

我的创作纪念日——《惊变128天》

我的创作纪念日——《惊变128天》 机缘收获日常成就憧憬 机缘 时光飞逝&#xff0c;转眼间&#xff0c;我已在这条创作之路上走过了 128 天。回顾起 2024 年 8 月 29 日&#xff0c;我满怀忐忑与期待&#xff0c;撰写了第一篇技术博客《讲解LeetCode第1题&#xff1a;两数之和…

stm32第一次烧录或者上电运行卡死问题分析

问题描述 单片机烧录代码&#xff08;刚上电&#xff09;无法立即运行&#xff0c;必须要复位一次或多次才能运行&#xff1b;跟踪调试会进入HardFault_Handler中断。 问题分析 烧录配置如下图&#xff0c;首先排除配置问题那么该问题就比较让人头大了&#xff0c;理论上&am…

YOLOV8训练好的best.pt模型转best.onnx并部署成python可调用

今天这篇博文是学习大佬作品以后&#xff0c;执行我的需求后的总结&#xff0c;做了一些代码调整&#xff0c;就此记录一下&#xff0c;非常感谢大佬提供如此好的输出。 已知yolov8 训练好的模型一般是pt格式&#xff0c;比如best.pt&#xff0c;现在我期望这个模型可以转成可以…