ArrayList和LinkedList的对比

现在网上大部分都说,ArrayList查询速度快,LinkedList增删速度快。其实这种说法是错误的。ArrayList底层是数组,在每次进行添加的时候实际上是在数组后面进行追加,在调用扩容机制grow,数组复制的时候,用到的语句底层是用C语言进行书写的,所以对效率的影响可以忽略不计(C语言执行效率较高)。而LinkedList在添加的时候是在创建对象。

ArrayList在查询的时候,实际上就是根据数组下标来获取值,而LinkedList是前后迭代式获取值,故ArrayList的查询速度是优于LinkedList的

总结:

在百万级数据以下其实ArrayList的增删速度实际上还是要优于LinkedList的,百万级数据以上如果还是向后追加的话,ArrayList速度还是要优于LinkedList速度的,如何数据量在百万级数据的时候建议用LinkedList,在我们实际的开发中需要一次进行处理这么大的数据量几乎没有。所以ArrayList的速度还是要优于LinkedList的。
 
原文链接:https://blog.csdn.net/Luisc_/article/details/93035810

两者关系:

d55d9234834a5718b582def1535eeda3.png

什么是ArrayList

1.  ArrayList 定义:

arraylist是动态数组,从数据结构上来讲,是数组实现的线性表(即顺序表)。

2. arraylist的特点:

①.容量不固定,想放多少放多少(当size大于capacity的时候,自动进行1.5倍扩容;添加的时候,容量加一)

②.有序的(元素输出顺序与输入顺序一致)

③.元素可以为 null

④.元素不唯一(可重复)

⑤.不同步,与之对应的是,vector是同步的

⑥.可以通过索引直接操作元素,而set不行

3. arraylist的主要成员变量:

Ⅰ.capacity:数组容量(长度),默认是10  

Ⅱ.size:当前元素个数

什么是LinkedList

1. 概述

LinkedList 是 Java 集合中比较常用的数据结构,与 ArrayList 一样,实现了 List 接口,只不过 ArrayList 是基于数组实现的,而 LinkedList 是基于链表实现的。所以 LinkedList 插入和删除方面要优于 ArrayList,而随机访问上则 ArrayList 性能更好。

除了 LIst 接口之外,LinkedList 还实现了 Deque,Cloneable,Serializable 三个接口。这说明该数据结构支持队列,克隆和序列化操作的。与 ArrayList 一样,允许 null 元素的存在,且是不支持多线程的。

2. LinkedList的定义:

LinkedList 是链表实现的线性表(双链表)

3. 双链表中的结点结构图:

8db124aaee7e6fe03f9920ce2c41a1ad.png 

4. linkedlist的意义:

我们知道 ArrayList 是以数组实现的,遍历时很快,但是插入、删除时都需要移动后面的元素,效率略差些。而LinkedList 是以链表实现的,插入、删除时只需要改变前后两个节点指针指向即可,省事不少。 

5. LinkedList 特点:

·双向链表实现

·元素是有序的,输出顺序与输入顺序一致

·允许元素为 null

·要找到某个结点,必须从头开始遍历。(查询慢,增删快)

·和 ArrayList 一样,不是同步容器

6. 注意:

由于linkedlist不是同步的,所以想要线程安全的时候,需要直接在初始化时用 Collections.synchronizedList 方法进行包装。

 

ArrayList 和 LinkedList 的区别是什么

1. 区别:

·  数组(ArrayList)的随机访问速度非常快,但是指定位置添加、删除操作时需要将后续元素全部顺移。

·  LinkedList则恰恰相反,我们在使用链表做指定位置的添加删除操作时,所需的操作非常少,但随机访问速度却非常慢。

·  ArrayList 的时间复杂度是 O(1),而 LinkedList 是 O(n)。

2. 注意:

·  如果频繁在尾部进行添加、删除操作,动态数组、双向链表均可选择

·  如果频繁在头部进行添加、删除操作,建议选择使用双向链表

·  如果有频繁的(在任意位置)添加、删除操作,建议选择使用双向链表

·  如果有频繁的查询操作(随机访问操作),建议选择使用动态数组

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值