源码分析——LinkedList的add和get方法原理分析
Posted 喵喵7781
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了源码分析——LinkedList的add和get方法原理分析相关的知识,希望对你有一定的参考价值。
Linked的add方法
/**
* Appends the specified element to the end of this list.
*
* <p>This method is equivalent to @link #addLast.
*
* @param e element to be appended to this list
* @return @code true (as specified by @link Collection#add)
*/
public boolean add(E e)
linkLast(e);
return true;
/**
* Links e as last element.
*/
void linkLast(E e)
final Node<E> l = last;
final Node<E> newNode = new Node<>(l, e, null);
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
1.初始化并添加第一个元素:last=null,则新创建一个Node节点,并赋值给first节点。
2.添加第二个元素:last有值,newNode赋值给last和l.next,新节点变成旧节点的后继节点。例子如下图:
LinkdedList的get方法
/**
* Returns the element at the specified position in this list.
*
* @param index index of the element to return
* @return the element at the specified position in this list
* @throws IndexOutOfBoundsException @inheritDoc
*/
public E get(int index)
//1.判断数组是否越界
checkElementIndex(index);
//2.返回查找值
return node(index).item;
private void checkElementIndex(int index)
if (!isElementIndex(index))
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
/**
* Returns the (non-null) Node at the specified element index.
*/
Node<E> node(int index)
// assert isElementIndex(index);
if (index < (size >> 1))
Node<E> x = first;
for (int i = 0; i < index; i++)
x = x.next;
return x;
else
Node<E> x = last;
for (int i = size - 1; i > index; i--)
x = x.prev;
return x;
1.判断数组是否下标越界
2.查找获取值:如果index<(size>>1)则从头部开始查找;否则,从尾部开始查找。
假设index=2,size=7,则size>>1=3,index<3,所以从头部开始查找。如果index=4,则index>3,则从尾部开始查找。
LinkdedList的getFirst方法
/**
* Returns the first element in this list.
*
* @return the first element in this list
* @throws NoSuchElementException if this list is empty
*/
public E getFirst()
final Node<E> f = first;
if (f == null)
throw new NoSuchElementException();
return f.item;
因为内存中存有first和last节点的值,所以直接从节点里面获取item属性即可。
以上是关于源码分析——LinkedList的add和get方法原理分析的主要内容,如果未能解决你的问题,请参考以下文章