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

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.kler.cn/a/537519.html

相关文章:

  • P1049 装箱问题(dp)
  • 69.弹窗显示复杂的数据框图 C#例子 WPF例子
  • WPF模板
  • 离线安装Appium Server
  • 使用 Python 编程语言来实现机器学习小项目教程案例
  • 鸿蒙UI(ArkUI-方舟UI框架)- 使用文本
  • c/c++蓝桥杯经典编程题100道(9)数组排序
  • 金和OA C6 DownLoadBgImage任意文件读取漏洞
  • Spinrg Security 浅谈
  • 后盾人JS -- 类类的
  • AtCoder Beginner Contest 391(A~E题题解)
  • MySQL InnoDB锁机制深度解析及高并发场景调优实践
  • Ubuntu20.4软件应用打不开
  • DeepSeek 实现原理探析
  • Windows安装cwgo,一直安装的是linux平台的
  • 【Redis】redis 存储的列表如何分页和检索
  • 【机器学习】超参数的选择,以kNN算法为例
  • 使用wireshark抓取python发起的https请求包
  • 海思的一站式集成环境Hispark Studio更新了
  • 机试题——第k大字母
  • 【stm32学习】STM32F103实操primary(FlyMCU)
  • 解锁 DeepSeek 模型高效部署密码:蓝耘平台全解析
  • Oracle中与 NLS(National Language Support,国家语言支持) 相关的参数
  • 【AI学习】关于 DeepSeek-R1的几个流程图
  • 使用 Docker 和 PM2 构建高并发 Node.js API 网关
  • 基于java的美食信息推荐系统的设计与实现(LW+源码+讲解)