集合源碼閱讀:LinkedList

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。?


# LinkedList -- 增刪快。# 1.繼承關系:public class LinkedList<E>extends AbstractSequentialList<E>implements List<E>, Deque<E>, Cloneable, java.io.Serializable# 2. 屬性:// 默認容量transient int size = 0;// 首字節transient Node<E> first;// 尾字節transient Node<E> last;# 3.方法:// 無參構造函數public LinkedList() {}// 返回包含指定集合元素的構造public LinkedList(Collection<? extends E> c) {this();addAll(c);}// 添加第一個元素private void linkFirst(E e) {// 定義 f ,賦值為首節點。final Node<E> f = first;// 定義新節點 newNode ,設置其后一節點為原首節點:f。final Node<E> newNode = new Node<>(null, e, f);// 把原首節點賦值為新節點:newNode。first = newNode;if (f == null)// 集合中無元素則,則新節點也是最后一節點。last = newNode;else// 設置 f 的前一節點為新節點。(final 修飾的變量其引用指針不可改,但其屬性可改。)f.prev = newNode;size++;modCount++;}// 添加最后一個元素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;elsel.next = newNode;// 集合元素加1。size++;// 集合修改次數加1。modCount++;}// 在指定的非空節點前添加元素void linkBefore(E e, Node<E> succ) {// succ 不為空。定義 pred ,賦值為 succ 的前一節點。final Node<E> pred = succ.prev;// 定義新節點 newNode,前一節點為:pred,后一節點為 succ。final Node<E> newNode = new Node<>(pred, e, succ);// 設置 succ 前一節點為 newNode 。succ.prev = newNode;if (pred == null)first = newNode;else// 設置 pred 的后一節點為新節點:newNode。pred.next = newNode;size++;modCount++;}// 刪除第一個節點private E unlinkFirst(Node<E> f) {// assert f == first && f != null;final E element = f.item;final Node<E> next = f.next;f.item = null;f.next = null; // help GCfirst = next;if (next == null)last = null;elsenext.prev = null;size--;modCount++;return element;}// 刪除最后一個節點private E unlinkLast(Node<E> l) {// assert l == last && l != null;final E element = l.item;final Node<E> prev = l.prev;l.item = null;l.prev = null; // help GClast = prev;if (prev == null)first = null;elseprev.next = null;size--;modCount++;return element;}// 刪除非空節點E unlink(Node<E> x) {// assert x != null;// 把要刪除的元素 x 賦值給 element,用于返回。final E element = x.item;// 定義 next,賦值為x的后一節點。final Node<E> next = x.next;// 定義 prev,賦值為 x 的前一節點。final Node<E> prev = x.prev;// 無前節點,則 x 的后一節點為首節點。if (prev == null) {first = next;} else {// 設置(x的前一節點)prev 的后一節點為x的后一節點: next。(跳過 x 節點)prev.next = next;// x 的前節點置空。x.prev = null;}// 不存在x的后一節點,則最后節點為x的前節點。if (next == null) {last = prev;} else {// 設置(x的后一節點)next 的前一節點為x的前一節點。(跳過 x 節點)next.prev = prev;// x 的后節點置空。x.next = null;}// x 本身的值置空。x.item = null;// 集合元數個數減1。size--;modCount++;return element;}// 查第一個節點。public E getFirst() {final Node<E> f = first;if (f == null)throw new NoSuchElementException();return f.item;}// 查最后一節點。public E getLast() {final Node<E> l = last;if (l == null)throw new NoSuchElementException();return l.item;}// 刪除并返回第一個節點public E removeFirst() {final Node<E> f = first;if (f == null)throw new NoSuchElementException();return unlinkFirst(f);}// 刪除并返回最后一個節點public E removeLast() {final Node<E> l = last;if (l == null)throw new NoSuchElementException();return unlinkLast(l);}// 新增第一個節點。public void addFirst(E e) {linkFirst(e);}// 新增最后一節點public void addLast(E e) {linkLast(e);}// 查是否存在指定節點public boolean contains(Object o) {return indexOf(o) != -1;}// 查集合中元素個數public int size() {return size;}// 新增最后一節點,并返回該節點。public boolean add(E e) {linkLast(e);return true;}// 刪除第一個和指定節點匹配的節點,指定節點不存在則不變。public boolean remove(Object o) {if (o == null) {for (Node<E> x = first; x != null; x = x.next) {if (x.item == null) {unlink(x);return true;}}} else {for (Node<E> x = first; x != null; x = x.next) {if (o.equals(x.item)) {unlink(x);return true;}}}return false;}// 在原集合尾部追加指定的集合。public boolean addAll(Collection<? extends E> c) {return addAll(size, c);}// 在指定位置插入指定的集合。index:元素在集合中的位置public boolean addAll(int index, Collection<? extends E> c) {// 查 index 對應節點是否在元素中,不在則拋異常checkPositionIndex(index);Object[] a = c.toArray();int numNew = a.length;if (numNew == 0)return false;Node<E> pred, succ;if (index == size) {succ = null;pred = last;} else {// 不斷2分查找,至找到 index 對應節點。succ = node(index);pred = succ.prev;}for (Object o : a) {@SuppressWarnings("unchecked") E e = (E) o;Node<E> newNode = new Node<>(pred, e, null);if (pred == null)first = newNode;elsepred.next = newNode;pred = newNode;}if (succ == null) {last = pred;} else {pred.next = succ;succ.prev = pred;}size += numNew;modCount++;return true;}// 刪除全部節點。有節點被引用也會釋放內存。public void clear() {for (Node<E> x = first; x != null; ) {Node<E> next = x.next;x.item = null;x.next = null;x.prev = null;x = next;}first = last = null;size = 0;modCount++;}// 查指定位置節點public E get(int index) {// 檢查 index ( 即:>0,< size)checkElementIndex(index);return node(index).item;}// 替換指定位置節點。返回舊節點。public E set(int index, E element) {checkElementIndex(index);Node<E> x = node(index);E oldVal = x.item;x.item = element;return oldVal;}// 指定位置插入指定節點public void add(int index, E element) {checkPositionIndex(index);if (index == size)linkLast(element);elselinkBefore(element, node(index));}// 刪除指定位置節點。public E remove(int index) {checkElementIndex(index);return unlink(node(index));}// 檢查索引是否有效。private boolean isElementIndex(int index) {return index >= 0 && index < size;}// 檢查索引是否有效。private boolean isPositionIndex(int index) {return index >= 0 && index <= size;}// 構造提示信息。private String outOfBoundsMsg(int index) {return "Index: "+index+", Size: "+size;}private void checkElementIndex(int index) {if (!isElementIndex(index))throw new IndexOutOfBoundsException(outOfBoundsMsg(index));}private void checkPositionIndex(int index) {if (!isPositionIndex(index))throw new IndexOutOfBoundsException(outOfBoundsMsg(index));}// 查指定非空節點。(不斷2分查找)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。public int indexOf(Object o) {int index = 0;if (o == null) {for (Node<E> x = first; x != null; x = x.next) {if (x.item == null)return index;index++;}} else {for (Node<E> x = first; x != null; x = x.next) {if (o.equals(x.item))return index;index++;}}return -1;}// 反向檢查指定節點是否存在。不存在返回-1。public int lastIndexOf(Object o) {int index = size;if (o == null) {for (Node<E> x = last; x != null; x = x.prev) {index--;if (x.item == null)return index;}} else {for (Node<E> x = last; x != null; x = x.prev) {index--;if (o.equals(x.item))return index;}}return -1;}// 查首節點public E peek() {final Node<E> f = first;return (f == null) ? null : f.item;}// 查首節點,集合為空則拋異常。public E element() {return getFirst();}// 查并刪除首節點。public E poll() {final Node<E> f = first;return (f == null) ? null : unlinkFirst(f);}// 查并刪除首節點,集合為空則拋異常。public E remove() {return removeFirst();}// 追加尾節點。public boolean offer(E e) {return add(e);}// 新增首節點。public boolean offerFirst(E e) {addFirst(e);return true;}// 追加尾節點。public boolean offerLast(E e) {addLast(e);return true;}// 查首節點。public E peekFirst() {final Node<E> f = first;return (f == null) ? null : f.item;}// 查尾節點public E peekLast() {final Node<E> l = last;return (l == null) ? null : l.item;}// 查并刪除首節點。public E pollFirst() {final Node<E> f = first;return (f == null) ? null : unlinkFirst(f);}// 查并刪除尾節點。public E pollLast() {final Node<E> l = last;return (l == null) ? null : unlinkLast(l);}// 新增首節點public void push(E e) {addFirst(e);}// 刪除并返回首節點。public E pop() {return removeFirst();}// 正向刪除指定節點。節點不存在則集合不變,返回 false 。public boolean removeFirstOccurrence(Object o) {return remove(o);}// 反向刪除指定節點。節點不存在則集合不變,返回 false 。public boolean removeLastOccurrence(Object o) {if (o == null) {for (Node<E> x = last; x != null; x = x.prev) {if (x.item == null) {unlink(x);return true;}}} else {for (Node<E> x = last; x != null; x = x.prev) {if (o.equals(x.item)) {unlink(x);return true;}}}return false;}// 返回迭代器public ListIterator<E> listIterator(int index) {checkPositionIndex(index);return new ListItr(index);}private class ListItr implements ListIterator<E> {private Node<E> lastReturned;private Node<E> next;private int nextIndex;private int expectedModCount = modCount;ListItr(int index) {// assert isPositionIndex(index);next = (index == size) ? null : node(index);nextIndex = index;}public boolean hasNext() {return nextIndex < size;}public E next() {checkForComodification();if (!hasNext())throw new NoSuchElementException();lastReturned = next;next = next.next;nextIndex++;return lastReturned.item;}public boolean hasPrevious() {return nextIndex > 0;}public E previous() {checkForComodification();if (!hasPrevious())throw new NoSuchElementException();lastReturned = next = (next == null) ? last : next.prev;nextIndex--;return lastReturned.item;}public int nextIndex() {return nextIndex;}public int previousIndex() {return nextIndex - 1;}public void remove() {checkForComodification();if (lastReturned == null)throw new IllegalStateException();Node<E> lastNext = lastReturned.next;unlink(lastReturned);if (next == lastReturned)next = lastNext;elsenextIndex--;lastReturned = null;expectedModCount++;}public void set(E e) {if (lastReturned == null)throw new IllegalStateException();checkForComodification();lastReturned.item = e;}public void add(E e) {checkForComodification();lastReturned = null;if (next == null)linkLast(e);elselinkBefore(e, next);nextIndex++;expectedModCount++;}public void forEachRemaining(Consumer<? super E> action) {Objects.requireNonNull(action);while (modCount == expectedModCount && nextIndex < size) {action.accept(next.item);lastReturned = next;next = next.next;nextIndex++;}checkForComodification();}final void checkForComodification() {if (modCount != expectedModCount)throw new ConcurrentModificationException();}}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;}}/*** @since 1.6*/public Iterator<E> descendingIterator() {return new DescendingIterator();}// 返回降序迭代器。private class DescendingIterator implements Iterator<E> {private final ListItr itr = new ListItr(size());public boolean hasNext() {return itr.hasPrevious();}public E next() {return itr.previous();}public void remove() {itr.remove();}}@SuppressWarnings("unchecked")private LinkedList<E> superClone() {try {return (LinkedList<E>) super.clone();} catch (CloneNotSupportedException e) {throw new InternalError(e);}}// 淺clone 。public Object clone() {LinkedList<E> clone = superClone();// Put clone into "virgin" stateclone.first = clone.last = null;clone.size = 0;clone.modCount = 0;// Initialize clone with our elementsfor (Node<E> x = first; x != null; x = x.next)clone.add(x.item);return clone;}// 轉為 Object 數組public Object[] toArray() {Object[] result = new Object[size];int i = 0;for (Node<E> x = first; x != null; x = x.next)result[i++] = x.item;return result;}// 拷貝原集合元素到指定數組。@SuppressWarnings("unchecked")public <T> T[] toArray(T[] a) {if (a.length < size)a = (T[])java.lang.reflect.Array.newInstance(a.getClass().getComponentType(), size);int i = 0;Object[] result = a;for (Node<E> x = first; x != null; x = x.next)result[i++] = x.item;if (a.length > size)a[size] = null;return a;}private static final long serialVersionUID = 876323262645176354L;// 寫出到流,序列化。private void writeObject(java.io.ObjectOutputStream s)throws java.io.IOException {// Write out any hidden serialization magics.defaultWriteObject();// Write out sizes.writeInt(size);// Write out all elements in the proper order.for (Node<E> x = first; x != null; x = x.next)s.writeObject(x.item);}// 從流讀入,反序列化。@SuppressWarnings("unchecked")private void readObject(java.io.ObjectInputStream s)throws java.io.IOException, ClassNotFoundException {// Read in any hidden serialization magics.defaultReadObject();// Read in sizeint size = s.readInt();// Read in all elements in the proper order.for (int i = 0; i < size; i++)linkLast((E)s.readObject());}// 創建拆分器@Overridepublic Spliterator<E> spliterator() {return new LLSpliterator<E>(this, -1, 0);}static final class LLSpliterator<E> implements Spliterator<E> {static final int BATCH_UNIT = 1 << 10; ?// batch array size incrementstatic final int MAX_BATCH = 1 << 25; ?// max batch array size;final LinkedList<E> list; // null OK unless traversedNode<E> current; ? ? ?// current node; null until initializedint est; ? ? ? ? ? ? ?// size estimate; -1 until first neededint expectedModCount; // initialized when est setint batch; ? ? ? ? ? ?// batch size for splitsLLSpliterator(LinkedList<E> list, int est, int expectedModCount) {this.list = list;this.est = est;this.expectedModCount = expectedModCount;}final int getEst() {int s; // force initializationfinal LinkedList<E> lst;if ((s = est) < 0) {if ((lst = list) == null)s = est = 0;else {expectedModCount = lst.modCount;current = lst.first;s = est = lst.size;}}return s;}public long estimateSize() { return (long) getEst(); }public Spliterator<E> trySplit() {Node<E> p;int s = getEst();if (s > 1 && (p = current) != null) {int n = batch + BATCH_UNIT;if (n > s)n = s;if (n > MAX_BATCH)n = MAX_BATCH;Object[] a = new Object[n];int j = 0;do { a[j++] = p.item; } while ((p = p.next) != null && j < n);current = p;batch = j;est = s - j;return Spliterators.spliterator(a, 0, j, Spliterator.ORDERED);}return null;}public void forEachRemaining(Consumer<? super E> action) {Node<E> p; int n;if (action == null) throw new NullPointerException();if ((n = getEst()) > 0 && (p = current) != null) {current = null;est = 0;do {E e = p.item;p = p.next;action.accept(e);} while (p != null && --n > 0);}if (list.modCount != expectedModCount)throw new ConcurrentModificationException();}public boolean tryAdvance(Consumer<? super E> action) {Node<E> p;if (action == null) throw new NullPointerException();if (getEst() > 0 && (p = current) != null) {--est;E e = p.item;current = p.next;action.accept(e);if (list.modCount != expectedModCount)throw new ConcurrentModificationException();return true;}return false;}public int characteristics() {return Spliterator.ORDERED | Spliterator.SIZED | Spliterator.SUBSIZED;}}

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/447489.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/447489.shtml
英文地址,請注明出處:http://en.pswp.cn/news/447489.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

開源工具:5個優秀的音頻編輯器

無論你要發布播客還是制作高品質的錄音&#xff0c;以下任意一款開源應用都能如你所愿。一個穩定的音頻編輯器也許并不是你的必需品&#xff0c;但它卻能在你的生意場上大顯身手。怎么樣&#xff1f;使用音頻編輯器&#xff0c;你可以添加音頻到你的企業網站&#xff0c;創建和…

JDK和CGLIB動態代理區別

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 前言 Github&#xff1a;https://github.com/yihonglei/thinking-in-spring JDK動態代理實現原理(jdk8)&#xff1a;https://blog.csdn…

對比Ruby和Python的垃圾回收(2):代式垃圾回收機制

本文由 伯樂在線 - 熊崽Kevin 翻譯自 patshaughnessy。歡迎加入 技術翻譯小組。轉載請參見文章末尾處的要求。對比Ruby和Python的垃圾回收&#xff08;1&#xff09; 上周&#xff0c;我根據之前在RuPy上做的一個名為“Visualizing Garbage Collection in Ruby and Python.”…

@Deprecated 注解 (@Documented?、@Retention、@Target)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 // 在看 Unsafe 類源碼時看到一個注解&#xff1a;Deprecated&#xff0c;似曾相識... Deprecated 用在類或者方法上&#xff0c;表示…

C++的未來和指針

本文由 伯樂在線 - 周昌鴻 翻譯自 Meeting C。歡迎加入 技術翻譯小組。轉載請參見文章末尾處的要求。上周Meeting C2013結束后&#xff0c;我對C思考了很多&#xff0c;有一些內容和指針有關。在C 11中只對指針進行了小量的更新&#xff08;引入了nullptr&#xff09;&#xf…

Java魔法類:Unsafe應用解析

Unsafe是位于sun.misc包下的一個類&#xff0c;主要提供一些用于執行低級別、不安全操作的方法&#xff0c;如直接訪問系統內存資源、自主管理內存資源等&#xff0c;這些方法在提升Java運行效率、增強Java語言底層資源操作能力方面起到了很大的作用。但由于Unsafe類使Java語言…

AMD迎接變革:加速OpenCL的未來

摘要&#xff1a;AMD在北京中關村皇冠假日酒店舉辦了以"迎接變革&#xff1a;加速進入OpenCL 的未來"為主題的技術培訓。AMD Firepro顯卡資深產品經理JC、OpenCL資深講師陸教授、謝博士與大家探討OpenCL技術將如何引領變革、鑄造計算新紀元。 4月11日&#xff0c;AM…

JAVA中神奇的雙刃劍--Unsafe

參考資料&#xff1a; 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Java魔法類&#xff1a;sun.misc.Unsafe在openjdk8下看Unsafe源碼 Unsafe介紹 在Oracle的Jdk8無法獲取到sun.misc…

讓AMD在中國發聲 APU14技術創新大會首次在華召開

今日&#xff0c;AMD一年一度的開發者峰會“APU2014”在北京拉開帷幕&#xff0c;這也是AMD首次在美國之外的城市舉辦該活動。AMD全球副總裁、大中華區董事總經理潘曉明表示&#xff0c;大中華區是AMD重要的戰略區域&#xff0c;AMD希望通過本次活動在中國制造巨大的聲音&#…

Python已成美國頂尖高校中最受歡迎的入門編程語言

在最近的一份調查中顯示&#xff0c;美國top高校中&#xff0c;Python已經成為教授計算機科學入門課程方面最受歡迎的語言。其中Top10 CS系中有8所使用Python&#xff0c;Top39 CS系中有24所&#xff0c;在入門課程中教授Python&#xff0c;可見其實用性的認可度很高。在我寫下…

源碼閱讀 AtomicInteger

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 AtomicInteger 原子整數 可以原子更新的int值。 用于原子遞增計數器等應用程序中&#xff0c;不能用作java.lang.Integer的替換。 擴展…

A飯福利,AMD Mantle API獲眾多游戲開發商青睞!

摘要&#xff1a;Videocardz整理了一份2014年—2015年支持AMD Mantle游戲列表&#xff0c;并公布了游戲開發商及游戲引擎的名稱。已發布且支持Mantle的游戲主要有《戰地4》、《神偷4》、《植物大戰僵尸&#xff1a;花園戰爭》以及《狙擊精英3》這四款。 現如今&#xff0c;越來…

linux 安裝 maven 、解決:bash: mvn: command not found

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1、安裝 wget 命令: yum -y install wget 2、下載maven安裝包 wget http://mirrors.cnnic.cn/apache/maven/maven-3/3.5.4/binaries/a…

軟件工程師必學的9件事

本文是html5tricks原創翻譯&#xff0c;轉載請看清文末的轉載要求&#xff0c;謝謝合作&#xff01; 三年前&#xff0c;我還在巴塞羅那的神經科學實驗室工作&#xff0c;忙著研究腦電波、教授心理學上的認知系統課程。而今天&#xff0c;我以設計和寫軟件為生。 你或許會滿頭…

Linux 的 chmod 命令,對一個目錄及其子目錄所有文件添加權限

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 對一個目錄及其子目錄所有文件添加權限 命令&#xff1a; chmod 777 -R ./html 給予html目錄下可讀可寫可操作權限。 或者 chmod -R…

Linux 下壓縮與解壓.zip 和 .rar

1)對于.ziplinux下提供了zip和unzip程序&#xff0c;zip是壓縮程序&#xff0c;unzip是解壓程序。它們的參數選項很多&#xff0c;可用命令zip -help和unzip -help查看&#xff0c;這里只做簡單介紹&#xff0c;舉例說明一下其用法&#xff1a;# zip test.zip test.jpg test.pn…

優秀的程序員VS糟糕的程序員

優秀的程序員和一般的程序員差別在哪里&#xff1f;怎么才能成為優秀的程序員&#xff1f;我們選擇了這個職業就要把他做好&#xff01; 優秀的程序員&#xff1a; 1、邏輯能力很強&#xff0c;這也是解決問題的關鍵。 2、分析能力。可以很好的解決復雜問題。 3、事情做得專…

圖解 Java 常用數據結構

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 最近在整理數據結構方面的知識, 系統化看了下Java中常用數據結構, 突發奇想用動畫來繪制數據流轉過程. 主要基于jdk8, 可能會有些特性與…

程序員生存定律--使人生永動的勢能

程序員生存定律這系列的目錄在這里&#xff1a;程序員生存定律--目錄 喜歡從頭瞄的&#xff0c;可以移步。 ------------------------------------------------------------------------------- 這篇說的是精神&#xff0c;比較務虛&#xff0c;不感興趣的可以略過。 在國內有…

int 和 Integer 的區別

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1、Integer是int的包裝類&#xff0c;int則是java的一種基本數據類型 2、Integer變量必須實例化后才能使用&#xff0c;而int變量不需要…