JDK1 6原始碼閱讀 LinkedList

2021-06-27 03:17:52 字數 2851 閱讀 3110

linkedlist是list的介面實現類,實現了所有可選的list操作且允許所有的元素(包括null值)。除了實現list介面之外,linkedlist類提供了統一的命名方法為了在列表的頭部和尾部get、remove、insert元素。這些操作允許鍊錶可以作為stack(棧)、queue(佇列)、deque(雙端佇列)。

linkedlist也實現了deque介面,為add、poll(輪詢?)和其他stack、deque方法提供了先進先出(first-in-first-out)佇列操作。

所有的這些操作實現作為雙向列表是可被預估到的。,無論是不是接近指定的索引,這些操作都會從表頭或表尾開始輪詢鍊錶。

注意,這些實現並不是同步的。如果多個執行緒同時訪問乙個鍊錶,至少有乙個執行緒結構上修改鍊錶,那必須表面上看起來是同步的。(結構上的修改是指新增或刪除乙個或多個元素,僅僅設定乙個元素的值並不是結構上的修改)。這可以非常典型地通過同步自然封裝列表的某些物件達到。

如果沒有這樣的物件存在,列表就應該用collections.synchronizedlis方法t來封裝。為了偶然地不同步訪問列表,這個應該在建立的時候就被做了。

list list = collections.synchronizedlist(new linkedlist(...));

linkedlist類的迭代器和迭代方法返回的迭代器都是快速失敗的(fail-fast),所以在迭代器被創立之後,如果對列表進行結構性的修改,除非通過迭代器本身的remove方法,迭代器都會丟擲乙個concurrentmodificationexception異常。因此,面對併發修改,迭代器很快就會完全失敗,而不冒在將來不確定的時間發生任意不確定行為的風險。

注意,迭代器的快速失敗行為不能得到保證,一般來說,存在非同步的併發修改時,不可能作出任何堅決的保證。快速失敗迭代器盡最大努力丟擲 concurrentmodificationexception。因此,編寫依賴於此異常的程式的做法是錯誤的,正確做法是:迭代器的快速失敗行為應該僅用於檢測程式錯誤。

private transient entryheader = new entry(null, null, null);

private transient int size = 0;

private static class entry

}

從原始碼上可以看出,linkedlist就是乙個雙向鍊錶。實體定義為元素、上一

entry、下一entry。

linkedlist有乙個頭entry,頭元素的next指向第乙個entry,previous指向最後乙個entry。

(1)contains

public boolean contains(object o) 

public int indexof(object o)

} else

}return -1;

}

判斷乙個物件是否在linkedlist中,就是找出這個物件在linkedlist中的索引位置,如果找不到,返回-1.

(2)add:插入列表尾部

public boolean add(e e) 

private entryaddbefore(e e, entryentry)

add(e e):預設插入頭entry之前,建立乙個待插入的新entry,next指向頭entry,

previous指向連表末尾。插入的操作就是,把原鍊錶末尾entry的next指向新entry,頭entry的previous指向新entry,同時把size增加1,modcount增加1。

(3)add:指定位置插入

public void add(int index, e element)

add(int index, e element):如果待插入位置的索引等於鍊錶的大小,就是要插入鍊錶的尾部,與

add(e e)方法相同。

如果不是插入尾部,而是插入鍊錶其他位置,就要根據索引找出所在位置的entry(查詢方法,下面會有講解)。建立乙個待插入的新entry,next指向原index位置的entry,previous指向原index-1位置的entry;原index-1位置的entry的next指向新entry,原index位置的previous指向新entry。這樣index-1位置的entry沒變,index位置變成了新entry,原index位置的entry變成了index+1。

(4)remove

public boolean remove(object o) 

}} else }}

return false;

}

private e remove(entrye)

移除列表中首先出現的指定的元素,如果沒出現,列表將不會變化。

從頭entry開始查詢,查詢到與指定元素相等的entry,然後移除這個entry;把待移除entry的上乙個entry的next指向entry的下乙個entry,待移除的entry的下乙個entry的previous指向待移除entry的上乙個entry,然後把待移除的entry置為null,size大小減1,modcount增加1。

JDK 原始碼 閱讀

to be continuing.持續修改中。1.stringbuffer 所處類層次 易忽略點 這個類是執行緒安全的。所有的method直接或間接加synchronized。所以我們如果是單執行緒情況下也考慮到這個會不會影響到效率。當然可能jit可以進行這個優化,待我接下來驗證。預設情況下乙個長為...

jdk原始碼閱讀 linkedlist

首先還是從建構函式開始 constructs an empty list.public linkedlist 是乙個空的 然後我們從add看 public boolean add e e 定位到linklast void linklast e e 觀察發現這個node是乙個雙向鍊錶,每乙個節點指著自...

JDK原始碼閱讀 Integer

先上一版字串轉數值的幾個方法的區別 parseint string s 解析字串數,10進製,返回int parseint string s,int radix 解析字串數,radix為指定進製,支援2 36進製 decode string nm 解析字串數,0開頭的為8進製,如010解析為2 0x...