Java 中的 List 接口有哪些实现类?

以下是Java中List接口的主要实现类及其特点的详细总结:


Java List 接口的主要实现类

1. ArrayList
  • 实现方式:基于动态数组
  • 特点
    • 查询高效:支持随机访问(通过索引),时间复杂度为O(1)
    • 增删较慢:中间插入/删除需移动元素,时间复杂度为O(n)
    • 非线程安全:多线程环境下需外部同步
    • 扩容机制:默认初始容量10,每次扩容为原容量的1.5倍
  • 适用场景:频繁查询、较少增删(如缓存数据存储)
  • 示例代码
    List<String> list = new ArrayList<>();
    list.add("Java");
    String element = list.get(0); // 快速访问
    
2. LinkedList
  • 实现方式:基于双向链表
  • 特点
    • 增删高效:头尾插入/删除时间复杂度为O(1)
    • 查询较慢:需遍历链表,时间复杂度为O(n)
    • 额外功能:实现了Deque接口,可用作队列或栈
  • 适用场景:频繁增删或需要队列/栈操作(如任务调度队列)
  • 示例代码
    LinkedList<Integer> queue = new LinkedList<>();
    queue.offer(1); // 入队
    int first = queue.poll(); // 出队
    
3. Vector
  • 实现方式:线程安全的动态数组
  • 特点
    • 同步方法:所有操作使用synchronized修饰,保证线程安全
    • 性能瓶颈:高并发场景下锁竞争严重
    • 历史遗留:JDK1.0存在,现多被替代方案取代
  • 替代方案
    // 使用Collections工具类包装
    List<String> syncList = Collections.synchronizedList(new ArrayList<>());// 或使用并发容器
    CopyOnWriteArrayList<String> safeList = new CopyOnWriteArrayList<>();
    
4. CopyOnWriteArrayList (JUC包)
  • 实现方式:写时复制(Copy-On-Write)技术
  • 特点
    • 读操作无锁:读取基于快照,无并发问题
    • 写操作加锁:修改时复制新数组,保证最终一致性
    • 内存消耗大:频繁写入会导致内存占用飙升
  • 适用场景:读多写极少(如事件监听器列表)
  • 示例代码
    CopyOnWriteArrayList<String> listeners = new CopyOnWriteArrayList<>();
    // 添加监听器(写操作较少)
    listeners.add("Listener1");
    // 遍历监听器(读操作频繁)
    listeners.forEach(System.out::println);
    
5. 特殊实现类
  • Stack(已过时)

    • 继承自Vector,提供栈操作(push/pop)
    • 建议替代方案:
      Deque<Integer> stack = new ArrayDeque<>(); // 更高效的栈实现
      stack.push(1);
      int top = stack.pop();
      
  • Arrays.ArrayList(内部类)

    • 通过Arrays.asList()创建
    • 固定大小:不支持增删操作
    • 示例
      List<String> fixedList = Arrays.asList("A", "B", "C");
      // fixedList.add("D"); // 抛出UnsupportedOperationException
      
  • Collections.EmptyList

    • 不可变的空列表
    • 使用场景:避免返回null的空集合表示
    • 示例
      List<String> emptyList = Collections.emptyList();
      

选择策略对比表

场景需求推荐实现类关键优势
高频随机访问ArrayListO(1)索引访问
频繁增删操作LinkedListO(1)头尾插入/删除
多线程读多写少CopyOnWriteArrayList无锁读+数据一致性
多线程读写均衡Collections.synchronizedList灵活同步控制
需要栈/队列功能LinkedList/ArrayDeque直接支持push/pop等操作
只读数据或固定集合Arrays.ArrayList零内存开销

性能对比示例

测试环境:百万级数据操作(JDK 17)

操作ArrayListLinkedListCopyOnWriteArrayList
随机访问10万次2ms4500ms3ms(读操作)
头部插入1万元素120ms8ms900ms(每次复制数组)
遍历所有元素15ms18ms16ms

总结

  • ArrayList:通用首选,适合大多数查询为主的场景
  • LinkedList:特定场景优化,如实现队列或频繁增删
  • Vector/CopyOnWriteArrayList:线程安全替代方案,根据写频率选择
  • 特殊实现类:用于不可变集合、空集合等边缘场景

理解各实现类的底层机制,能帮助开发者根据数据规模、操作类型和并发需求做出最优选择,从而提升系统性能与资源利用率。

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

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

相关文章

Arrays工具类详解

目录 1. Arrays.toString() 方法 2. Arrays.deepToString() 方法 3. Arrays.equals(int[ ] arr1, int[ ] arr2) 方法 4. Arrays.equals(Object[] arr1, Object[] arr2) 方法 5. Arrays.deepEquals(Object[] arr1, Object[] arr2) 方法 6. Arrays.sort(int[] arr) 方法 7…

设计高效的测试用例:从需求到验证

在现代软件开发过程中&#xff0c;测试用例的设计一直是质量保证&#xff08;QA&#xff09;环节的核心。有效的测试用例不仅能够帮助发现潜在缺陷&#xff0c;提升软件质量&#xff0c;还能降低后期修复成本&#xff0c;提高开发效率。尽管如此&#xff0c;如何从需求出发&…

基于YoloV11和驱动级鼠标模拟实现Ai自瞄

本文将围绕基于 YoloV11 和驱动级鼠标实现 FPS 游戏 AI 自瞄展开阐述。 需要着重强调的是&#xff0c;本文内容仅用于学术研究和技术学习目的。严禁任何个人或组织将文中所提及的技术、方法及思路应用于违法行为&#xff0c;包括但不限于在各类游戏中实施作弊等违规操作。若因违…

三角测量——用相机运动估计特征点的空间位置

引入 使用对极约束估计了相机运动后&#xff0c;接下来利用相机运动估计特征点的空间位置&#xff0c;使用的方法就是三角测量。 三角测量 和对极几何中的对极几何约束描述类似&#xff1a; z 2 x 2 R ( z 1 x 1 ) t z_2x_2R(z_1x_1)t z2​x2​R(z1​x1​)t 经过对极约束…

【AI论文】Visual Instruction Tuning

文献核心目标 作者的目标是通过多模态指令微调(Visual Instruction Tuning)来训练一个通用的视觉助手,使其能够理解用户的语言指令并与视觉内容结合完成任务。例如,用户可以上传图片并提出问题,模型根据图片内容作出回答。 1. 引言 什么是多模态交互?为什么重要? 人类…

SQL-leetcode—1407. 排名靠前的旅行者

1407. 排名靠前的旅行者 表&#xff1a;Users ---------------------- | Column Name | Type | ---------------------- | id | int | | name | varchar | ---------------------- id 是该表中具有唯一值的列。 name 是用户名字。 表&#xff1a;Rides -------------------…

如何本地部署DeepSeek

第一步&#xff1a;安装ollama https://ollama.com/download 打开官网&#xff0c;选择对应版本 第二步&#xff1a;选择合适的模型 https://ollama.com/ 模型名称中的 1.5B、7B、8B 等数字代表模型的参数量&#xff08;Parameters&#xff09;&#xff0c;其中 B 是英文 B…

Git生成公钥和私钥的方式

因为需要访问远程Git服务器&#xff0c;需要使用公钥&#xff1a; 1、先检测电脑上是否已经有.ssh目录 像我这就是没有的 2、开始生成一个新的SSH密钥&#xff08;RSA&#xff09; 打开Git Bash, 然后运行ssh-keygen -t rsa -b 4096 -C "注释" -t rsa是密匙类型…

常用的python库-安装与使用

常用的python库函数 yield关键字openslide库openslide库的安装-linuxopenslide的使用openslide对象的常用属性 cv2库numpy库ASAP库-multiresolutionimageinterface库ASAP库的安装ASAP库的使用 concurrent.futures.ThreadPoolExecutorxml.etree.ElementTree库skimage库PIL.Image…

SQL-leetcode—1393. 股票的资本损益

1393. 股票的资本损益 Stocks 表&#xff1a; ---------------------- | Column Name | Type | ---------------------- | stock_name | varchar | | operation | enum | | operation_day | int | | price | int | ---------------------- (stock_name, operation_day) 是这张…

【Audio】Android 10车载音频路由

音频路由 在 Android 10 中&#xff0c;car_audio_configuration.xml 取代了 car_volumes_groups.xml 和 IAudioControl.getBusForContext。新的配置文件定义了一个音频区列表。每个音频区都拥有一个或多个音量组及其关联设备&#xff0c;而每台设备都具有应在该音频区内进行路…

Spring中都应用了哪些设计模式?

好的&#xff01;以下是您提到的八种设计模式在 Spring 中的简单示例&#xff1a; 1. 简单工厂模式 简单工厂模式通过传入参数来决定实例化哪个类。Spring 中的 BeanFactory 就是简单工厂模式的应用。 示例代码&#xff1a; // 1. 创建接口和具体实现类 public interface A…

【Oracle专栏】本地 expdp 导出远程库

Oracle相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 1.背景 近期需要在远程备份机器上远程导出数据库,之前用expdp数据泵只导出过本服务器的,本文跨服务器使用expdp 。 2. 测试 2.1 本机装完整oracle时,执行expdp导出远端数据库 实验说明:以下12为本机,14…

Flink KafkaConsumer offset是如何提交的

一、fllink 内部配置 client.id.prefix&#xff0c;指定用于 Kafka Consumer 的客户端 ID 前缀partition.discovery.interval.ms&#xff0c;定义 Kafka Source 检查新分区的时间间隔。 请参阅下面的动态分区检查一节register.consumer.metrics 指定是否在 Flink 中注册 Kafka…

【leetcode】双指针:移动零 and 复写零

文章目录 1.移动零2.复写零 1.移动零 class Solution { public:void moveZeroes(vector<int>& nums) {for (int cur 0, dest -1; cur < nums.size(); cur)if (nums[cur] ! 0)swap(nums[dest], nums[cur]);} };class Solution { public:void moveZeroes(vector&l…

【Elasticsearch】Bucket Count K-S Test 聚合

Bucket Count K-S Test是 Elasticsearch 中的一种兄弟管道聚合&#xff08;sibling pipeline aggregation&#xff09;&#xff0c;用于执行双样本柯尔莫哥洛夫-斯米尔诺夫检验&#xff08;Kolmogorov-Smirnov Test&#xff0c;简称 K-S 检验&#xff09;。这种聚合主要用于比较…

网络安全工程师逆元计算 网络安全逆向

中职逆向题目整理合集 逆向分析&#xff1a;PE01.exe算法破解&#xff1a;flag0072算法破解&#xff1a;flag0073算法破解&#xff1a;CrackMe.exe远程代码执行渗透测试天津逆向re1 re22023江苏省re12023年江苏省赛re2_easygo.exe2022天津市PWN 逆向分析&#xff1a;PE01.exe …

【网络安全.渗透测试】Cobalt strike(CS)工具使用说明

目录 前言 一、工具显著优势 二、安装 Java 运行环境 三、实验环境搭建要点 四、核心操作流程详解 (一)环境准备与连接步骤 (二)主机上线与深度渗透流程 五、其他实用功能应用指南 (一)office 宏 payload 应用 (二)Https Payload 应用 (三)信息收集策略 …

五十天精通硬件设计第27天-时域频域知识

系列文章传送门 50天精通硬件设计第一天-总体规划-CSDN博客 目录 一、时域(Time Domain) 二、频域(Frequency Domain) 三、时域与频域的联系 四、区别与典型应用 五、实际应用示例 六、进阶概念 时域和频域是信号处理中的两个核心概念,用于从不同角度分析和处理信号…

string类(二)

目录 前言 string类的常用接口说明 3、string类对象的容量操作 3.1 size&#xff0c;length和capacity 3.2 empty和clear 3.3 reserve 3.4 resize 4、string类的修改操作 4.1 operator 4.2 c_str 4.3 findnpos 5、string类非成员函数 5.1 operator>>和opera…