LinkedList中查詢(contains)和刪除(remove)源碼分析

一、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。

二、remove源碼對比

通過查閱,發現remove方法和contains方法的源碼實現非常相似,列出如下:

/*** Removes the first occurrence of the specified element from this list, * if it is present.  If this list does not contain the element, it is* unchanged. * @param o element to be removed from this list, if present* @return {@code true} if this list contained the specified element*/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;
}

對比發現,和contains類似,remove操作首先也是查找Object o是否存在與表中。空節點元素和非空節點的循環判斷基本相同,在找到Object o后,區別與contains的返回索引,remove需要刪除節點link(LinkedList的刪除需要對next鏈進行重配置引用)。

刪除節點的方法unlink的源碼如下:

//Unlinks non-null node x. 
E unlink(Node<E> x) {// assert x != null;final E element = x.item;final Node<E> next = x.next;final Node<E> prev = x.prev;if (prev == null) {first = next;} else {prev.next = next;x.prev = null;}if (next == null) {last = prev;} else {next.prev = prev;x.next = null;}x.item = null;size--;modCount++;  //注:已從結構上修改此列表的次數。AbstractList屬性return element;
}

分析:
刪除節點程序中,需要考慮節點在鏈表中的不同位置,進行不同的操作。

1、節點于鏈表首端

clipboard.png

此時,特殊操作是需要將first指針(引用)指向其后的節點。

first = next;

2、節點于鏈表尾端

clipboard.png

此時,需要將上一個節點的next指針指向null,即上個節點稱為尾節點。

last = prev;

3、節點于鏈表中間情況

clipboard.png

如果不仔細思考,我們在寫程序時,會直接在兩個if判斷后,將剩余的相關操作寫在一起。而源碼并沒有這么做,稍作分析,就能看出,如果前一個if中,條件是prev,因此可對該節點的prev進行相關操作。而后續的if語句,還需判斷該節點的next引用,因此在第一個if-else語句體中,不對next進行操作,否則更改后,后學的next已經不是該節點的原next值。

因此,第一個if-else中:

prev.next = next;
x.prev = null;

第二個if-else中:

next.prev = prev;
x.next = null;

三、總結

從LinkedList的源碼可以看到,源程序中相應方法代碼簡潔,邏輯清晰正確,在學習java的過程中,除了學習知識為我所用,也要避免閉門造車,多查看源碼和其他優秀的項目程序,參考優秀的編程習慣和思想,從而積累經驗,提高自己的水平。

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

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

相關文章

分塊入門

我貌似和所有的數據結構都有些誤會。。。。。。 在處理一些修改查詢問題的時候&#xff0c;我們可以利用分治的思想&#xff0c;比如說把一個線性的數據不斷分成一棵二叉樹&#xff0c;也就是我們所說的線段樹&#xff0c;這樣我們就可以在logn的時限里做到修改和查詢。同理我們…

開始使用gitlab

不得不說&#xff0c;我真不是一個合格的程序猿&#xff0c;工作馬上兩年了&#xff0c;github和gitlab用的一點也不熟練&#xff0c;每次興致來了就搞幾下&#xff0c;可是每次都淺嘗輒止&#xff0c;不求甚解&#xff0c;時間一長&#xff0c;上一次練習的步驟就都記不起來了…

Spark 2.2.0 文檔中文版 Collaborative Filtering 協同過濾 JAVA推薦系統

協同過濾常用于推薦系統&#xff0c;這項技術旨在填補 丟失的user-item關聯矩陣 的條目&#xff0c;spark.ml目前支持基于模型的協同過濾&#xff08;用一些丟失條目的潛在因素在描述用戶和產品&#xff09;。spark.ml使用ALS&#xff08;交替最小二乘法&#xff09;去學習這些…

淘寶top平臺調用接口響應時間優化

我的專欄地址&#xff1a;我的segmentfault,歡迎瀏覽 一、背景 調用top接口的響應時間長&#xff08;160ms左右&#xff09;&#xff0c;超時和連接異常頻繁發生。導致消息組件消費工程的tps遇到瓶頸&#xff08;單實例單消息隊列250tps&#xff09;&#xff0c;只能通過增加實…

樹上倍增一些理解和寫法

樹上倍增可以比較容易求得i節點的第k個父親&#xff0c;我們定義一個二維數組fa[i][j]代表節點i的第2^j個父親&#xff0c;關于有什么用我們等會再說&#xff0c;現在先學會怎么去求這個fa數組 我們可以通過從根節點開始一遍dfs求得所有fa數組&#xff0c;首先我們發現fa數組有…

圖像去畸變和添加畸變

背景&#xff1a;最近的項目中用到的圖像去畸變的知識&#xff0c;剛開始是直接調用opencv中提供的函數cv::initUndistortRectifyMap()和cv::remap()函數&#xff0c;實現圖像的全局去畸變&#xff0c;但是由于圖像的分辨率很高&#xff0c;再加上&#xff0c;實際過程中我們只…

win10上編譯libharu庫

背景&#xff1a; 最近的項目需要自動的生成pdf文件&#xff0c;我在網上查看相關的資料&#xff0c;發現目前比較流行的生成pdf文件的庫有兩個&#xff0c;一個是libpdf&#xff0c;另一個是libharu。libpdf個人使用時免費的但是商業使用就需要收費了&#xff0c;否則得到的p…

爬蟲——正則表達式re模塊

為什么要學習正則表達式 實際上爬蟲一共就四個主要步驟&#xff1a; 明確目標&#xff1a;需清楚目標網站爬&#xff1a;將所有的目標網站的內容全部爬下來取&#xff1a;在爬下來的網站內容中去掉對我們沒有用處的數據&#xff0c;只留取我們需要的數據處理數據&#xff1a;按…

深入Spring Boot:快速集成Dubbo + Hystrix

2019獨角獸企業重金招聘Python工程師標準>>> 背景 Hystrix 旨在通過控制那些訪問遠程系統、服務和第三方庫的節點&#xff0c;從而對延遲和故障提供更強大的容錯能力。Hystrix具備擁有回退機制和斷路器功能的線程和信號隔離&#xff0c;請求緩存和請求打包&#xff…

BZOJ2333 [SCOI2011]棘手的操作 【離線 + 線段樹】

題目 有N個節點&#xff0c;標號從1到N&#xff0c;這N個節點一開始相互不連通。第i個節點的初始權值為a[i]&#xff0c;接下來有如下一些操作&#xff1a; U x y: 加一條邊&#xff0c;連接第x個節點和第y個節點 A1 x v: 將第x個節點的權值增加v A2 x v: 將第x個節點所在的連通…

opencv圖像仿射變換和普通旋轉

背景&#xff1a;今天需要對程序生成的圖像進行旋轉90度和下采樣操作&#xff0c;當然還有改變圖像類型的操作&#xff0c;就是把原來.png的圖像轉換為.jpg的圖像&#xff0c;主要是我目前使用libharu庫&#xff0c;無法成功從本地加載png圖像到pdf中去&#xff0c;不得不使用j…

討厭麻煩的ora 01722無效數字

webservice開發過程中&#xff0c;數據庫由原來的oracle改為現在的sql server。然后重新調試&#xff0c;結果報出ora 01722無效數字的錯誤。 由于連接oracle數據庫的時候并沒有問題&#xff0c;所以一開始我以為是數據庫不同&#xff0c;導致部分數據類型差異&#xff0c;&…

CSS樣式:覆蓋規則

規則一&#xff1a;由于繼承而發生樣式沖突時&#xff0c;最近祖先獲勝。 CSS的繼承機制使得元素可以從包含它的祖先元素中繼承樣式&#xff0c;考慮下面這種情況: <html><head><title>rule 1</title><style>body {color:black;}p {color:blue;}…

try{}里有一個 return 語句,那么緊跟在這個 try 后的 finally {}里的 code 會 不會被執行,什么時候被執行,在 return 前還是后?...

這是一道面試題&#xff0c;首先finally{}里面的code肯定是會執行的&#xff0c;至于在return前還是后&#xff0c; 看答案說的是在return后執行&#xff0c;我覺得不對&#xff0c;百度了一下&#xff0c;有說return前的&#xff0c;有說return后的&#xff0c;還有return中間…

相機和鏡頭選型需要注意哪些問題

背景&#xff1a; 最近需要優于項目需求需要對工業相機和鏡頭進行選型&#xff0c;于是我就開啟的學習相機之旅&#xff0c;雖然我一直在做機器視覺方向&#xff0c;但是我對相機的了解還是很少&#xff0c;我想正好趁這次機會好好學習一下。如果有錯誤的觀點請指正。 一、相…

響應式網頁布局 - W3Schools How-Tos 01

W3Schools教學系列 W3Schools是知名的網頁設計&#xff0f;前端開發教學網站&#xff0c;不僅提供HTML、CSS、JavaScript等的詳盡教學&#xff0c;還可以把它當作說明文件&#xff08;Documents&#xff09;。有經驗的前端或多或少已經接觸過這個網站&#xff0c;因為它經常出現…

正則表達式,終極使用!3個工具,搞定一切

文章前提&#xff0c;本人。不會正則的不論什么語法&#xff0c;僅僅懂一點正則的概念。本人從未自己寫過正則&#xff0c;都是網上收羅進行改動的。相同。沒有時間去研究正則。 可是為了方便&#xff0c;入手了幾個工具。 如今就為大家一一展示。 第一個&#xff0c;regexBuil…

iOS 在tableview的側滑事件里執行tableView.selectRow無效的解決辦法

很奇怪的問題&#xff0c;在執行默認選中一個cell的時候&#xff0c;突然發現這句話不起作用了 &#xff08;我的場景是&#xff1a;當前cell側滑刪除后&#xff0c;默認選中上一個cell&#xff09; 搞了半天&#xff0c;終于發現罪魁禍首竟然是因為&#xff1a;這句話寫在了側…

VS2017 C++工程 執行python腳本

我解決了哪怕很小的一個問題&#xff0c;我也想記錄下來來見證我的經歷。 背景&#xff1a; 一、使用libhuru庫生成pdf報告 最近參與一些測試工作&#xff0c;希望測試結束后能夠根據測試得到的數據和圖像自動生成測試報告&#xff0c;最開始調研到了生成報告的庫有libharu和…

標準正弦波變頻電源調制方式的實現

目前變頻電源正不斷向規模化、專業化、智能化、精細化方向發展。變頻電源的技術隨著工業電器電子制造的興起而不斷得到重視和發展。其中,中港揚以正弦脈SPWM為核心變頻電源系統電路便是一個很好的代表。純硬件電路在焊接電路上比較復雜&#xff0c;但是調節出來的SPWM波形比較完…