作者:Tarun Telang 来源:https://dzone.com/articles/arraylist-or-linkedlist

本文为Java开发人员选择适当的顺序数据结构提供指导。

ArrayList 和 LinkedList 是 Java 集合框架中用来存储对象引用列表的两个类。ArrayList 和 LinkedList 都实现 List 接口。首先,让我们了解一下它们最重要的父接口——List。

# 1、List 接口

列表(list)是元素的有序集合,也称为序列。它提供了基于元素位置的操作,有助于快速访问、添加和删除列表中特定索引位置的元素。List 接口实现了 Collection 和 Iterable 作为父接口。它允许存储重复值和空值,支持通过索引访问元素。

# 2、具体用法

下面是使用 List 接口声明 ArrayList 和 LinkedList 的代码片段。

Vector 与 ArrayList 类似,只是 Vector 支持自动同步,这也使得 Vector 线程安全,但同时会带来一些性能损耗。

# 3、内部实现

LinkedList 内部实现

Linkedlist 数据结构包含一组有序的数据元素,称为节点。每个元素都包含对其后续元素,即下一个元素的链接或引用。 序列的最后一个元素(尾部)指向空元素。链表本身包含对链表第一个元素的引用,该元素称为 head 元素。Java 中的 LinkedList 是 List 接口的双向链表。在双向链表中,每个节点都指向它的上一个节点和下一个节点。此外,它还实现了其他接口,比如 Serializable、 Cloneable 和 Deque(实现 Queue 作为父接口)。

ArrayList 内部实现

ArrayList 是可调整大小的数组,实现了 List 接口。 它的内部是一个对象数组,可以根据需要扩容支持在集合中加入更多元素。可以通过构造函数 ArrayList(int initialCapacity)指定 ArrayList 的初始容量,然后在必要时使用 void ensureCapacity(int minCapacity) 增加容量,确保至少可以容纳初始化时最小容量参数指定数量的元素。

它还提供一个方法 void trimToSize(),可以减少现有元素的大小。

// 调用构造函数 ArrayList(initialCapacity)List arr = new ArrayList(10);

默认情况下,ArrayList 创建初始容量为10的列表,而 LinkedList 只构造一个没有设置任何初始容量的空列表。 Linkedlist 不实现 RandomAccess 接口,而 ArrayList 实现了 RandomAccess 接口(而非 Deque 接口)。

# 4、各种操作的时空复杂性

# 5、提示

考虑下面遍历 LinkedList 的示例代码。在这段代码中遍历会非常慢,因为 LinkedList 不支持随机访问,因此每次遍历都会带来巨大的开销。

LinkedList ll = new LinkedList();……Object o = null;for (int i = 0; i < list.size(); i++){ o = list.get(i); …}

一个更好的方法可提高性能,像下面这段代码。

LinkedList ll = new LinkedList();……Object o = null;ListIterator li = list.listIterator(0);while (li.hasNext()){ o = ll.next(); …}

# 6、总结

相比较而言 ArrayList 更快而且更好,因为它支持对其元素的随机访问。 遍历链表或在中间插入新元素开销很大,因为必须遍历每个元素而且很可能遇到缓存失败。 如果需要在一次迭代中对列表中的多个项目执行处理,那么 LinkedList 的开销比 ArrayList 使用时多次复制数组元素的开销要小。

欢迎分享你对这个话题的经验与见解,请在文章的评论区中提出你的想法。

结构体中vector自动为0_面试题:你是如何选择顺序存储数据结构的?相关推荐

  1. C# 8: 可变结构体中的只读实例成员

    在之前的文章中我们介绍了 C# 中的 只读结构体(readonly struct)[1] 和与其紧密相关的 in 参数[2]. 今天我们来讨论一下从 C# 8 开始引入的一个特性:可变结构体中的只读实 ...

  2. malloc和free——结构体中动态内存的管理

    C语言中内存的管理主要是依据malloc和free实现的,其中malloc主要是实现内存的分配,而free则是实现内存的释放.虽然这是我们已经很熟悉的,但是还是存在一些问题.特别是当结构体中存在指针的 ...

  3. 【C 语言】结构体 ( 结构体中嵌套二级指针 | 为 结构体内的二级指针成员 分配内存 | 释放 结构体内的二级指针成员 内存 )

    文章目录 一.结构体中嵌套二级指针 1.结构体中嵌套二级指针 类型声明 2.为 结构体内的二级指针成员 分配内存 3.释放 结构体内的二级指针成员 内存 二.完整代码示例 一.结构体中嵌套二级指针 1 ...

  4. 【C 语言】结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存 然后再为指针分配内存 | 释放内存时先释放 指针成员内存 然后再释放结构头内存 )

    文章目录 一.结构体中嵌套一级指针 1.声明 结构体类型 2.为 结构体 变量分配内存 ( 分配内存时先 为结构体分配内存 然后再为指针分配内存 ) 3.释放结构体内存 ( 释放内存时先释放 指针成员 ...

  5. c++ 结构体和vector进行lower_bound和upper_bound

    总述: 介绍结构体数组和包含结构体的vector怎么样使用lower_bound进行二分查找,upper_bound同理. 前提: lower_bound:返回数组中第一个大于等于该元素的下标,int ...

  6. 获取结构体中变量的偏移量

    C/C++获取结构体中变量的偏移量 1.某些特殊需求下,我们需要知道某个变量在其结构体中的偏移位置. 通常的做法就是定义一个宏变量,如下: #define OFFSET(structure, memb ...

  7. 结构体中定义函数指针

    结构体指针变量的定义,定义结构体变量的一般形式如下: 形式1:先定义结构体类型,再定义变量 struct结构体标识符 { 成员变量列表;- }; struct 结构体标识符 *指针变量名; 变量初始化 ...

  8. 结构体中最后一个成员为[0]或[1]长度数组(柔性数组成员)的用法

    结构体中最后一个成员为[0]长度数组的用法:这是个广泛使用的常见技巧,常用来构成缓冲区.比起指针,用空数组有这样的优势:(1).不需要初始化,数组名直接就是所在的偏移:(2).不占任何空间,指针需要占 ...

  9. 【C语言】宏offsetof的模拟实现 (计算结构体中某变量相对于首地址的偏移)

    首先我们应该特别留意 : offsetof 是一个宏,并非是一个函数 ! 宏offsetof的介绍 : 参数:第一个是结构体类型名称,第二个是结构体成员名 返回类型:size_t无符号整形 引用的头文 ...

最新文章

  1. ICLR2020 | 谷歌最新研究:用“复合散度”量化模型合成泛化能力
  2. 并发的核心:CAS 是什么?Java8是如何优化 CAS 的?
  3. .NET网络编程学习(二)
  4. 如何做数据库分页查询
  5. es5 和 es6 class
  6. netbeans java桌面应用程序_java – 使用Netbean的桌面应用程序的状态栏
  7. 可以上网但是不能ping通局域网
  8. median frequency balancing
  9. 当老鼠拥有“鹰眼”,人类世界会发生什么变化?
  10. WKWebView预初始化
  11. Android Studio搭建阿里云生活物联网平台自有品牌APP
  12. CC1350、CC1352R和CC1352P究竟各有何优势
  13. 美国高防服务器到底好不好用
  14. App用户协议隐私政策
  15. Python实现中英文翻译脚本
  16. 计算机制图公开课,信息工程大学公开课:地图文化(6集全)
  17. Say hello to x86_64 Assembly [part 2]
  18. java list分组聚合
  19. 我是如何在知乎上赚钱的?真实经验分享,可操作性强
  20. ATSAMA5D3X学习

热门文章

  1. PLSQL连接oracel数据库_用户无法登陆_oci.dll_配置问题
  2. 微软中文网,越办越好了!
  3. python语音识别框架_横评:五款免费开源的语音识别工具
  4. 老板思维:工作负责人是首问责任制
  5. Lock的lockInterruptibly()
  6. oracle实例与数据库
  7. html 表单控制器,c# – html表单发布到mvc控制器
  8. recyclerview item动画_这可能是你见过的迄今为止最简单的RecyclerView Item加载动画...
  9. java 判断是否是list_JAVA从头开始一基础梳理(4-3)
  10. jelly bean android,Jelly Bean占Android系统份额突破10%