linkedlist
- 底层采用双向链表实现,插入O(1),查找On)
- 实现了deque接口,可以进行队列操作,在此不做分析
- fail-fast机制,防止结构意外改变
基础结构
linkedlist内部采用双向链表结构存储数据,其内部定义了Node数据结构
1 | private static class Node<E> { |
构造方法
linkedlist有两个构造方法,一种用于构造空链表,一种用传入的集合创建链表
1 |
|
添加元素
add(E e)
把新节点加入到链表末尾,所以调用linklast1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 public boolean add(E e) {
linkLast(e);
return true;
}
/**
* Links e as last element.
*/
void linkLast(E e) {
//获取原来最后一个元素
final Node<E> l = last;
//创建新元素对应的node,并将前向指针指向原来最后一个元素
final Node<E> newNode = new Node<>(l, e, null);
//把last指向新插入的元素
last = newNode;
if (l == null)
//如果原来最后一个元素是null,说明新加入的元素是第一个元素,所以first也指向该元素
first = newNode;
else
//如果原来链表中存在元素,则把倒数第二个元素的后向指针指向新元素
l.next = newNode;
size++;
modCount++;
}
add(int index, E element)
在传入的位置上添加元素
1 | public void add(int index, E element) { |
调用linkBefore
1 | //根据下标查找node |
删除元素
remove(Object o)
删除指定元素
1 | public boolean remove(Object o) { |
remove(int index)
移除指定位置元素
1 | public E remove(int index) { |
remove()
删除头节点
1 | public E remove() { |
removeFirstOccurrence(Object o)
删除第一次出现的元素
1 | //底层借助remove实现 |
removeLastOccurrence(Object o)
删除最后一次出现的元素
1 | public boolean removeLastOccurrence(Object o) { |
查找元素
get(int index)
1 | public E get(int index) { |
indexOf(Object o)
从前向后遍历,返回改元素第一次出现的下标位置
1 | public int indexOf(Object o) { |
lastIndexOf(Object o)
从后向前遍历,返回该元素第一次出现的位置,如果没有匹配元素返回-1
1 | public int lastIndexOf(Object o) { |
迭代器
linkedlist可返回的迭代器和arraylist类似,都有Itr和ListItr,但是linkedlist能返回DescendingIterator,DescendingIterator用于反向遍历
1 | //基于ListItr实现 |
clone
linkedlist实现了cloneable接口,表明linkedlist可以复制
linkedlist的clone方法调用了Object的clone,该方法为浅复制;链表复制时,add方法也只是拿到了x的指针,所以linkedlist的clone方法也是浅复制
1 | public Object clone() { |