標籤:
之前寫程式似乎也沒有怎麼關注過底層的結構,最近正好遇到了鏈表的問題,於是仔細閱讀了Java中鏈表的實現LinkedList
簡單記錄一下看完的總結:
1.LinkedList中定義了一個類型Node<E> ,包括3個屬性,即Node中封裝的元素item,當前元素的前一個元素引用和後一個元素引用prev/next,和鏈表定義一直,沒什麼新鮮
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; } }
2.鏈表的特點是在首尾新增內容比較快捷,所以LinkedList除了實現List介面的add/remove外,還增加了在首尾增加元素的方法addFirst/addList ,removeFirst,removeLast,以及getFirst,getLast擷取首尾元素的方法
3.List介面中得get/remove/add等操作實際上都是操作鏈結表的最末尾
其中我一直想知道的是鏈表中對List介面中得get(index)方法是如何?的,或者說現實容易,有什麼最佳化呢,看了原始碼,發現原來最佳化的內容並沒有我想像的高端,具體是:
首先,看index位於的鏈表的前一半還是後一半(對size>>1 得出中間數,然後判斷index和size>>1的關係得知)
然後,如果index在鏈表的前半部分,就正向遍曆,如果index在鏈表的後半段,則是從末尾開始遍曆
這是LinkedList中根據給定的索引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; } }
當打算原始碼的時候,如果其中的大部分內容已經知道個大概了,只有一些細節不清楚,這種狀態下,收穫最大,完全不知道,或者完全知道的時候,看原始碼都沒有什麼意思,這是一直以來我的學習心得。
Java中LinkedList筆記