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

集合之List--ArrayList与LinkedList以及List与数组、Set的区别

在java中,List是最常用的集合类型之一,而ArrayList和LinkedList是List接口的两种主要实现。它们各有优缺点,适用于不同的场景。此外,List与数组、Set之间也有显著的区别。以下是对他们的详细对比和分析

一、ArrayList与LinkedList的区别

ArrayList

  • 底层实现:基于动态数组

  • 特点

    • 随机访问速度快:通过索引访问元素的时间复杂度为O(1)。

    • 插入和删除效率低:在中间插入或删除元素时,需要移动后续元素,时间复杂度为O(n)

    • 内存占用少:只需要存储元素本身,不需要额外的指针

  • 适用场景:

    • 频繁读取数据(如遍历或随机访问)

    • 数据量较大且插入/删除操作较少的场景

示例:

List<String> arrayList = new ArrayList<>();
arrayList.add("A");
arrayList.add("B");
arrayList.add("C");
System.out.println(arrayList.get(1)); // 输出:B

LinkedList

  • 底层实现:基于双向链表

  • 特点

    • 插入和删除效率高:在链表中间插入或删除元素的时间复杂度为O(1).

    • 随机访问速度慢:需要从头或尾遍历链表,时间复杂度为O(n)。

    • 内存占用多:每个元素需要额外的指针(前驱和后继)

  • 适用场景

    • 频繁插入或删除数据的场景

    • 需要实现栈、队列或双向队列的场景

示例:

List<String> linkedList = new LinkedList<>();
linkedList.add("A");
linkedList.add("B");
linkedList.add("C");
linkedList.add(1, "D"); // 在索引1处插入元素
System.out.println(linkedList); // 输出:[A, D, B, C]

ArrayList 与 LinkedList 对比

特性ArrayListLinkedList
底层实现动态数组双向链表
随机访问速度O(1)O(n)
插入/删除速度O(n)(需要移动元素)O(1)(只需修改指针)
内存占用较少(只存储元素)较多(需要存储指针)
适用场景频繁读取、数据量较大频繁插入/删除、实现栈/队列

二、List与数组的区别

数组

  • 固定长度:数组的长度在创建时确定,无法动态扩展。

  • 类型固定:数组只能存储相同类型的元素。

  • 性能高:数组的访问速度非常快,因为它是连续的内存块。

  • 功能有限:数组没有提供丰富的方法(如添加、删除、查找等)。

示例:

String[] array = new String[3];
array[0] = "A";
array[1] = "B";
array[2] = "C";
System.out.println(array[1]); // 输出:B

List

  • 动态长度List 的长度可以动态扩展。

  • 类型灵活List 可以存储任意类型的对象(通过泛型指定)。

  • 功能丰富List 提供了丰富的方法(如 addremovecontains 等)。

  • 性能较低:相比数组,List 的访问速度稍慢(尤其是 LinkedList)。

示例:

List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
System.out.println(list.get(1)); // 输出:B

List 与数组对比

特性数组List
长度固定长度动态长度
类型只能存储相同类型可以存储任意类型(泛型)
性能访问速度快访问速度稍慢
功能功能有限功能丰富(添加、删除、查找等)
适用场景数据量固定、性能要求高数据量动态变化、功能需求多

三、List与Set的区别

List

  • 有序:元素按照插入顺序存储。

  • 允许重复:可以存储相同的元素。

  • 索引访问:可以通过索引访问元素。

  • 实现类ArrayListLinkedListVector 等。

示例:

List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("A"); // 允许重复
System.out.println(list); // 输出:[A, B, A]

Set

  • 无序:元素不保证顺序(LinkedHashSet 除外)。

  • 不允许重复:相同的元素只能存储一次。

  • 无索引访问:不能通过索引访问元素。

  • 实现类HashSetLinkedHashSetTreeSet 等。

示例:

Set<String> set = new HashSet<>();
set.add("A");
set.add("B");
set.add("A"); // 不允许重复
System.out.println(set); // 输出:[A, B](顺序不确定)

List 与 Set 对比

特性ListSet
顺序有序无序(LinkedHashSet 除外)
重复元素允许重复不允许重复
索引访问支持不支持
实现类ArrayListLinkedListHashSetTreeSet
适用场景需要保留顺序和重复元素需要去重、不关心顺序

四、 总结

  • ArrayList vs LinkedList

    • ArrayList 适合频繁读取和随机访问的场景。

    • LinkedList 适合频繁插入和删除的场景。

  • List vs 数组

    • 数组适合数据量固定、性能要求高的场景。

    • List 适合数据量动态变化、功能需求多的场景。

  • List vs Set

    • List 保留顺序和重复元素。

    • Set 去重且不保证顺序。

根据具体的业务需求,选择合适的数据结构可以显著提高程序的性能和可维护性


http://www.kler.cn/a/567300.html

相关文章:

  • win7电脑上最好安装 Python什么版本?
  • 8 SpringBoot进阶(上):AOP(面向切面编程技术)、AOP案例之统一操作日志
  • 子宫腺肌症会导致不孕吗?
  • Zion x 硅基流动 DeepSeek接入指南
  • 卢卡斯定理判断组合数奇偶(Codeforces Round 1006 (Div. 3)——F)
  • 买二赠一--蓝桥
  • 版图自动化连接算法开发 00003 ------ 添加两个中间点实现 Manhattan 方式连接两个给定的坐标点
  • 升级Office软件后,Windows 系统右键里没有新建Word、Excel、PowerPoint文件的解决办法
  • 网络原理--TCP/IP(2)
  • SERPENTINE Tools
  • OAK相机的抗震性测试
  • redis repl_backlog_first_byte_offset 这个字段的作用
  • Linux网络 TCP全连接队列与tcpdump抓包
  • 【SWAT模型应用】AI辅助下基于ArcGIS Pro的SWAT模型全流程高效建模实践与深度进阶应用
  • 51单片机编程学习笔记——管脚输出
  • 高频面试题(含笔试高频算法整理)基本总结回顾16
  • 性能调优篇——索引优化与执行计划解析
  • Vue3响应式原理解析
  • docker使用代理的简单配置
  • 在 Vim 中查找一个单词的命令