您的位置:首页 > 编程语言 > Java开发

JDK1.8源码阅读记录LinkedList类

2020-03-22 18:19 246 查看

JDK1.8源码阅读记录

JAVA.Util包

LinkedList类

public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable

LinkedList,是链式列表,底层基于双向链表实现,可以在首尾、或指定索引处操作元素,元素可以重复,可当作栈、队列、双端队列使用。不是线程安全的。可克隆,序列化。
LinkedList适用于频繁在中间位置插入、删除元素的场合。但随机访问速度较慢,需要从头开始逐个找。LinkedList虽然有涉及到索引值,但其索引值的实现是通过遍历取得,并不等于普通数组自带的索引值。
与ArrayList相比,ArrayList基于动态数组,以数组的形式存储,内存是连续的,随机访问速度快,由于每次插入和删除都需要移动数组中的元素,因此不适合于在线性表中间需要频繁进行插入和删除操作。

属性

transient int size = 0;//LinkedList长度
transient Node<E> first;//LinkedList首节点
transient Node<E> last;//LinkedList尾节点

transient表示该类实例在序列化的时候不会考虑这些属性。
在这里,要提示下本类的内部类,表示节点,Node

private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;

Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}

声明为私有的,明确只有在本外部类才可以使用。

  • item,表示该节点的值或内容
  • next,表示该节点的后一个节点
  • prev,表示该节点的前一个节点

构造方法

//实例一个空链表
public LinkedList() {
}

//将集合c里的元素作为节点,实例链表
public LinkedList(Collection<? extends E> c) {
this();
addAll(c);
}
public boolean addAll(Collection<? extends E> c) {
return addAll(size, c);
}
//由于构造函数在使用的时候,size=0,因此这里的index也为0
public boolean addAll(int index, Collection<? extends E> c) {
checkPositionIndex(index);

Object[] a = c.toArray();//以c为源,创建新数组a
int numNew = a.length;//新数组a的长度
if (numNew == 0)//空数组,返回false,表示无添加
return false;

Node<E> pred, succ;//定义某个节点的前后节点
if (index == size) {//相当于在链表尾部添加,若链表为空,也相当于在头部添加
succ = null;//尾部添加,暂不用考虑某节点的后一个节点
pred = last;//尾部添加,以原链表的最后一个节点作为要添加节点的前个节点
} else {//非尾部添加
succ = node(index);//获取指定索引处的节点,作为要添加节点的后个节点
pred = succ.prev;//指定索引处的节点的前个节点,作为要添加节点的前个节点
}

for (Object o : a) {//真正的添加操作
@SuppressWarnings("unchecked") E e = (E) o;
Node<E> newNode = new Node<>(pred, e, null);//由对象e(o)创建新节点,顺便链接前节点
if (pred == null)//相当于头部添加
first = newNode;//新节点作为头节点
else
pred.next = newNode;//通过pred的next链接本新节点
pred = newNode;//单个节点添加完毕,顺便把pred赋值为本新节点
}

if (succ == null) {//表示此前的添加为尾部添加
last = pred;//指定本链表的尾部节点为最后一个加入本链表的新节点
} else {//非尾部添加
pred.next = succ;//由最后一个加入本链表的新节点链接原链表的后部分节点
succ.prev = pred;//由原链表的后部分节点链接最后一个加入本链表的新节点
}

size += numNew;//长度加上这次添加的节点数
modCount++;//修改次数增1
return true;//返回true,表示由添加新节点
}

常用方法

在LinkedList中,有多种节点的增删改操作,但在链表中的增、删、改操作与addAll()方法中执行的真正增加操作思路类似,每次执行完毕后,都要modCount增1。

  • getLast()
    返回此列表中的最后一个元素(非节点),链表为空会抛出异常
  • getFirst()
    返回此列表中的第一个元素(非节点),链表为空会抛出异常
  • removeFirst()
    删除链表的头节点,并返回该节点的元素,链表为空会抛出异常
  • removeLast()
    删除链表的尾节点,并返回该节点的元素,链表为空会抛出异常
  • addFirst(E e)
    将指定的元素插入此列表的开头。无返回值。
  • addLast(E e)
    将指定的元素追加到此列表的末尾。无返回值。
  • contains(Object o)
    如果此列表包含指定的元素,则返回true。
  • size()
    返回链表的大小(int值)
  • add(E e)
    将指定的元素追加到此列表的末尾,增加成功返回true
  • remove(Object o)
    从此列表中删除第一次出现的指定元素,如果存在,则将其删除。如果此列表不包含元素,则不变。删除成功返回true。
  • clear()
    从该列表中删除所有元素。 此调用返回后,列表将为空。无返回值。
  • get(int index)
    返回此列表中指定位置的元素。
  • set(int index, E element)
    用指定的元素替换此列表中指定位置的元素。返回旧值。
  • add(int index, E element)
    将指定的元素插入此列表中的指定位置。 将当前在该位置的元素(如果有的话)和任何后继元素向右移动(在其索引处增加一个)。无返回值。
  • remove(int index)
    删除指定索引值处的元素,并返回该元素。

查找操作方法

  • indexOf(Object o)
    返回指定元素在此列表中首次出现的索引,如果此列表不包含该元素,则返回-1。
  • lastIndexOf(Object o)返回指定元素在此列表中最后一次出现的索引;如果此列表不包含该元素,则返回-1。

队列操作方法

  • peek()
    检索但不删除此列表的头(第一个元素)。返回该元素,若链表为空,则返回null。
  • element()
    检索但不删除此列表的头(第一个元素)。返回该元素,若链表为空,则抛出异常。
  • poll()
    检索并删除此列表的头(第一个元素)。返回该元素,若链表为空,则返回null。
  • remove()
    检索并删除此列表的头(第一个元素)。返回该元素,若链表为空,则抛出异常。
  • offer(E e)
    将指定的元素添加为此列表的尾部(最后一个元素)。增加成功返回true。相当于
    add(e)
  • offerFirst(E e)
    将指定的元素插入此列表的前面。增加成功返回true。相当于
    addFirst(e)
  • offerLast(E e)
    将指定的元素插入此列表的后面。增加成功返回true。相当于
    addLast(e)
  • peekFirst()
    检索但不删除此列表的第一个元素,返回该元素,如果此列表为空,则返回 null。
  • peekLast()
    检索但不删除此列表的最后一个元素,返回该元素,如果此列表为空,则返回null。
  • pollFirst()
    检索并删除此列表的第一个元素,返回该元素,如果此列表为空,则返回null。
  • pollLast()
    检索并删除此列表的最后一个元素,返回该元素,如果此列表为空,则*或返回{null。
  • push(E e)
    将元素压入此列表表示的堆栈。换句话说,将元素插入此列表的前面。无返回值。
  • pop()
    从此列表表示的堆栈中弹出一个元素。换句话说,删除并返回此列表的第一个元素。
  • removeFirstOccurrence(Object o)
    删除首次出现在此列表中的指定元素(从头到尾遍历列表时)。如果列表不包含该元素,则它保持不变。删除成功返回true。
  • removeLastOccurrence(Object o)
    删除此列表中最后一次出现的指定元素(从头到尾遍历列表时)。如果列表不包含该元素,则它保持不变。删除成功返回true。

迭代器方法

  • listIterator(int index)
    返回列表中元素的列表迭代器(以适当的顺序),从列表中的指定位置开始。
  • descendingIterator()
    返回列表中元素的迭代器,操作顺序跟列表迭代器相反。
  • 点赞
  • 收藏
  • 分享
  • 文章举报
麻辣西瓜zero 发布了14 篇原创文章 · 获赞 0 · 访问量 368 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: