LinkedList中查詢(contains)源碼分析

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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章