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)
将指定的元素追加到此列表的末尾,增加成功返回trueremove(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()
返回列表中元素的迭代器,操作顺序跟列表迭代器相反。
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- 【JDK1.8】JDK1.8集合源码阅读——LinkedList
- JDK1.8源码阅读记录LinkedHashMap类
- JDK源码阅读——LinkedList实现
- JDK源码阅读——ArrayList\LinkedList
- JDK 1.7源码阅读笔记(三)集合类之LinkedList
- Java -- 基于JDK1.8的LinkedList源码分析
- LinkedList源码解析(JDK1.8)!
- Java之LinkedList源码解读(JDK 1.8)
- JDK1.8 --- ArrayList-LinkedList源码解析
- jdk源码阅读--(LinkedList)
- Java集合类详解(2) -- 从JDK1.8源码看LinkedList
- 基于JDK1.8的LinkedList源码学习笔记
- 【集合框架】JDK1.8源码分析之LinkedList(七)
- Java集合框架成员之LinkedList类的源码分析(基于JDK1.8版本)
- JDK源码阅读——LinkedList
- LinkedList(JDK1.8)源码分析
- Java集合:LinkedList (JDK1.8 源码解读)
- LinkedList源码解析——JDK1.8
- JDK源码阅读LinkedList
- LinkedList源码分析(jdk1.8)