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 经过对极约束…

如何本地部署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…

【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…

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

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

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…

医疗影响分割 | 使用 Swin UNETR 训练自己的数据集(3D医疗影像分割教程)

<Swin UNETR: Swin Transformers for Semantic Segmentation of Brain Tumors in MRI Images> 代码地址:unetr 论文地址:https://arxiv.org/pdf/2201.01266 一、下载代码 在Github上下载代码,然后进入SWINUNETR,前两个是针对两个数据集(BRATS21、BTCV)的操作,这里…

在CAD中插入图块后为什么看不到?怎么解决?

按照正确操作插入图块&#xff0c;但图纸上不显示新插入的图块&#xff0c;这是为什么&#xff1f; 原因可能是大家插入的图块太小&#xff0c;导致看不到&#xff0c;显示成一个点&#xff0c;所以大家插入图块的时候记得根据图纸大小&#xff0c;将比例改大一些就可以啦✌️…

【CMAEL多智能体框架】第一节 环境搭建及简单应用(构建一个鲜花选购智能体)

第一节 环境搭建 文章目录 第一节 环境搭建前言一、安装二、获取API1. 使用熟悉的API代理平台2.设置不使用明文存放API 三 、具体应用进阶任务 总结 前言 CAMEL Multi-Agent是一个开源的、灵活的框架&#xff0c;它提供了一套完整的工具和库&#xff0c;用于构建和模拟多智能体…

Flink-序列化

一、概述 几乎每个Flink作业都必须在其运算符之间交换数据&#xff0c;由于这些记录不仅可以发送到同一JVM中的另一个实例&#xff0c;还可以发送到单独的进程&#xff0c;因此需要先将记录序列化为字节。类似地&#xff0c;Flink的堆外状态后端基于本地嵌入式RocksDB实例&…

使用DeepSeek和Kimi快速自动生成PPT

目录 步骤1&#xff1a;在DeepSeek中生成要制作的PPT主要大纲内容。 &#xff08;1&#xff09;在DeepSeek网页端生成 &#xff08;2&#xff09;在本地部署DeepSeek后&#xff0c;使用chatBox生成PPT内容 步骤2&#xff1a;将DeepSeek成的PPT内容复制到Kimi中 步骤3&…

第41天:Web开发-JS应用微信小程序源码架构编译预览逆向调试嵌套资产代码审计

#知识点 1、安全开发-微信小程序-搭建&开发&架构&安全 2、安全开发-微信小程序-编译调试&反编译&泄露 一、小程序创建&#xff08;了解即可&#xff09; 1、下载微信开发者工具 2、创建小程序模版引用 https://developers.weixin.qq.com/miniprogram/dev/d…

Arduino 第十一章:温度传感器

Arduino 第十一章&#xff1a;LM35 温度传感器 一、LM35 简介 LM35 是美国国家半导体公司&#xff08;现德州仪器&#xff09;生产的一款精密集成电路温度传感器。与基于热力学原理的传统温度传感器不同&#xff0c;LM35 能直接将温度转换为电压输出&#xff0c;且输出电压与…

Oracle常用导元数据方法

1 说明 前两天领导发邮件要求导出O库一批表和索引的ddl语句做国产化测试&#xff0c;涉及6个系统&#xff0c;6千多张表&#xff0c;还好涉及的用户并不多&#xff0c;要不然很麻烦。 如此大费周折原因&#xff0c;是某国产库无法做元数据迁移。。。额&#xff0c;只能我手动导…