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集合的底层是用数组实现的
数组的特点就是查询快、增删慢
查询速度快(注意:是根据索引查询数据快) ︰查询数据通过地址值和索引定位,查询任意数据耗时相同。
删除效率低: 可能需要把后面很多的数据进行前移。
添加效率极低: 可能需要把后面很多的数据后移,再添加元素;或者也可能需要进行数组的扩容。
实现方式:
- 利用无参构造器创建的集合,会在底层创建一个默认长度为0的数组
- 添加第一个元素时,底层会创建一个新的长度为10的数组
- 存满时,会扩容1.5倍
- 如果一次添加多个元素,1.5倍还放不下,则新创建数组的长度以实际为准
应用场景
ArrayList适合:根据索引查询数据,比如根据随机索引取数据(高效),或者数据量不是很大的时候
ArrayList不适合:数据量大的同时,又要频繁的进行增删操作
LinkedLIst 集合的底层原理
底层是基于双链表实现的
什么是链表?
链表中的结点是独立的对象,在内存中是不连续的,每个结点包含数据值和下一个结点的地址
链表的特点:
- 查询慢,无论查询那个数据都要从头开始找
- 链表的增删相对快
双链表是什么?
双链表在内存中是不连续的,每个结点包含数据值和下一个结点的地址以及上一个数据的地址
特点:查询慢,增删相对较快,但是对首尾元素进行增删改查的速度是极快的
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