特点:它基于双向链表实现
- 双向链表结构:每个节点都包含数据部分、前驱指针(指向前一个节点)和后继指针(指向后一个节点)在链表中间插入和删除元素时非常高效
- 查询性能较低:因为它需要从链表的头部或尾部遍历到指定的索引位置
- 插入和删除性能高:插入和删除元素时具有较高的性能。只需要修改元素的前后引用
- 线程不安全
- 允许存储空元素
- 内存开销较大
1.add(E e)
流程大概是这样的:除了开始和结尾节点的数据其他节点的数据都有一个前后指针,用来指向当前节点的上一个节点或当前节点的下一个节点,插入和删除元素的操作比较高效
/**
* Links e as last element. 把当前元素作为最后一个元素
*/
void linkLast(E e) {
//1.获取这个集合的最后一个元素,初始添加为null
final Node<E> l = last;
//2.将传入的元素和最后一个元素放入node中
final Node<E> newNode = new Node<>(l, e, null);
//3.将传入的元素设置为最新元素
last = newNode;
//4.如果为null传入的元素就是第一个
if (l == null)
first = newNode;
else
//5.如果不为null传入的元素就是下一次传入的元素的前一个元素
l.next = newNode;
size++;
modCount++;
}
通过源码可知,数据的插入默认是从尾部添加的