java集合-ArrayList与LinkedList底层原理

91 阅读3分钟

java集合-ArrayList与LinkedList

首先要知道List系列集合的特点:有序、可重复、有索引

ArrayList的特点:有序、可重复、有索引

LinkedList的特点:有序、可重复、有索引

但是他们的底层原理不同,应用场景不同

其中List也是一个接口,还是一样的用多态的写法,来创建对象

List集合的特有方法:

list集合因为支持索引,所以多了很多与索引相关的方法,当然,Collection的功能List也都继承了

方法名称说明
void add(int index,E element)在此集合中的指定位置插入指定的元素
E remove(int index)删除指定索引处的元素,返回被删除的元素
E set(int index,E element)修改指定索引处的元素,返回被修改的元素
E get(int index)返回指定索引处的元素

遍历方式也是有很多种:

  • for循环(因为List集合有索引)
  • iterator迭代器
  • 增强for循环
  • Lambda表达式

ArrayList 集合的底层原理

ArrayList集合的底层是用数组实现的

数组的特点就是查询快、增删慢

集合1111.png

查询速度快(注意:是根据索引查询数据快) ︰查询数据通过地址值和索引定位,查询任意数据耗时相同。

删除效率低: 可能需要把后面很多的数据进行前移。

添加效率极低: 可能需要把后面很多的数据后移,再添加元素;或者也可能需要进行数组的扩容。

实现方式:

  • 利用无参构造器创建的集合,会在底层创建一个默认长度为0的数组
  • 添加第一个元素时,底层会创建一个新的长度为10的数组
  • 存满时,会扩容1.5倍
  • 如果一次添加多个元素,1.5倍还放不下,则新创建数组的长度以实际为准

应用场景

ArrayList适合:根据索引查询数据,比如根据随机索引取数据(高效),或者数据量不是很大的时候

ArrayList不适合:数据量大的同时,又要频繁的进行增删操作

LinkedLIst 集合的底层原理

底层是基于双链表实现的

什么是链表?

链表中的结点是独立的对象,在内存中是不连续的,每个结点包含数据值和下一个结点的地址

集合2222.png

链表的特点:

  • 查询慢,无论查询那个数据都要从头开始找
  • 链表的增删相对快

双链表是什么?

双链表在内存中是不连续的,每个结点包含数据值和下一个结点的地址以及上一个数据的地址

集合33333.png

特点:查询慢,增删相对较快,但是对首尾元素进行增删改查的速度是极快的

LinkedList新增的一个特殊方法

方法名称说明
public void addFirst(E e)在该列表开头插入指定的元素
public void addLast(E e)将指定的元素追加到此列表的末尾
public E getFirst()返回此列表中的第一个元素
public E getLast()返回此列表中的最后一个元素
public E removeFirst()从此列表中删除并返回第一个元素
public E removeLast()从此列表中删除并返回最后一个元素

LinkedList应用场景

  • 用来设计队列:只是在首尾增删元素,用LinkedList很合适: 先进先出,后进后出

  • 用来设计栈:后进先出,先进后出来,

    • 数据在入栈模型的过程称为:压/进栈push
    • 数据在出栈模型的过程成为:弹/出栈pop