contains源碼分析
本文分析雙向鏈表LinkedList的查詢操作源碼實現。jdk中源程序中,LinkedList的查詢操作,通過contains(Object o)函數實現。具體見下面兩部分程序:
①
public boolean contains(Object o) {
return indexOf(o) != -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;
}
indexOf函數查詢對象o在鏈表中的索引位置。
源碼首先將元素爲null的情形單獨判讀剝離,個人分析,應該是如果不單獨分析,null元素在下邊的for循環中,不能執行o.equals操作(編譯器輸入null.,會自動將已有輸入替換爲NullPointerException.,提示空指針異常)。
由於鏈表不同於數組,在內存中並非連續存儲,因此訪問某個元素需要遍歷。源程序中使用for循環進行遍歷。index表示鏈表元素索引,初值爲0。
1、針對空元素(null)的情況,用for循環遍歷,查找元素爲null的節點,並返回索引index。for循環初始條件爲頭指針(無元素),判斷條件爲節點不爲null,自增表達式爲x重賦值爲下個節點(利用節點x的next指針實現,在java中next爲node對象的屬性成員)。每次自增,index+1。
2、針對非空元素,遍歷操作同上。函數結束的判斷條件變爲o.equals(x.item),這裏equals方法爲Object超類的方法,程序中元素類型非Object也可調用。
兩種情形下,鏈表遍歷完畢(仍爲return),表明該元素o在鏈表中不存在,因此返回-1。