本文基于java8的代码,是分析他的数据结构,插入,查询等功能。他既实现了List,也实现了Deque,所以它既可以当做动态数组,也可以像队列那样子去使用。
数据结构
他的成本变量有以下几个:
1 | // 长度,也就是元素个数 |
Node类的声明如下:
1 | private static class Node<E> { |
从数据结构上我们就可以看得出LinkedList他的数据结构是以链表的形式存在,有点是插入,删除效率高,确定是无法快速通过下标进行直接查询。
主要方法分析
List接口下的方法
主要的是link
系列和unlink
系列的方法
add方法
在add(E e)
方法中,他是往链表末端插入一个元素,是直接调用linkLast(E e)
去实现的,该方法的代码和解析如下
1 | void linkLast(E var1) { |
addFirst方法
他是往链接的头部插入一个元素,是通过调用linkFirst(E e)
来实现的,下面是代码和分析
1 | private void linkFirst(E var1) { |
get/set方法
在获取元素或者是设置某个位置的值的时候,首先第一步是调用checkElementIndex(int index)
来保证获取坐标/设置坐标是合法的(即index>=0 && index<size),否则会报IndexOutOfBoundsException
。然后通过Node<E> node(int index)
获得这个index位置的节点值,该方法的代码和分析如下
1 | Node<E> node(int index) { |
得到这个Node之后,就直接返回这个Node的item值或者是设置这个Node的item值。
remove方法
包括remove(Object o)
和remove(int index)
remove(Object o)
,他是首先通过遍历查询到这个o
所在的Node
节点,然后通过unlink(Node<E> x)
方法进行移除。remove(int index )
,代码和分析如下,他首先是检测这个index是否合法,然后通过node(index)
获取到这个元素,在之后是通过unlink(Node<E> x)
方法进行移除元素。unlink(Node<E> x)
的代码和分析如下
1 | E unlink(Node<E> x) { |
indexOf和lastIndexOf
他们两个比较简单,一个是从开头去遍历查找,一个是从尾部往前去查找。contains(Object o)
也是通过调用indexOf(Object o)
来判断元素是否存在集合中的。
Deque和Queue接口下的特有方法
boolean offer(E e)
,向末尾插入元素,通过调用add
实现E poll()
,把首节点移除并返回回去,通过unlinkFirst
方法实现E element()
,获取首节点,首节点为null则抛出异常E peek()
,获取firt
这个node的值,为null则返回Nullvoid addFirst(E e)
,调用linkFirst(e)
实现往头部插入元素void addLast(E e)
,调用linkLast(e)
实现往尾部插入元素boolean offerFirst(E e)
调用addFirst(e)
实现往头部插入元素boolean offerLast(E e)
,调用addLast(e)
实现往尾部插入元素E peekFirst()
,获取首节点的值,为null则返回nullE peekLast()
,获取末节点的值,为null则返回nullE pollFirst()
,获取首节点的值,假如不为null则同时把该节点从链表中移除E pollLast()
,获取末节点,假如不为null则同时把末节点从来链表中移除void push(E e)
,调用addFirst
E pop()
,调用removeFirst()
E removeFirst()
,假如首节点不存在会报错,否则移除首节点并返回E removeLast()
,假如末节点不存在会报错,否则移除末节点并返回E getFirst()
,假如首节点不存在会报错,否则返回首节点的值E getLast()
,假如末节点不存在会报错,否则返回末节点的值
迭代器
在LinkedList中,可以通过listIterator(int index)
获取在他内部实现的ListIterator
对象,这个内部类可以往前或往后进行遍历,也可以增加或者删除等
其他接口的实现
Cloneable
可调用clone
方法Serializable
可序列化