Java的List集合框架之LinkedList詳細解析
(一)List子父層級:
- List接口繼承于Collection,Collection繼承Iterable;
- LIst接口實現(xiàn)類分為:Vector、ArrayList、LinkedList;
(二)List實現(xiàn)類
1、LinkedList實現(xiàn)類
(1)LinkedList底層是內(nèi)部Node類的存儲,prev、next、item值,同時最外層還有first、last節(jié)點;
(2)LinkedList是線程不安全的,多線程環(huán)境會報并發(fā)修改異常java.util.ConcurrentModificationException。
(3)LinkedList無擴容機制,底層是雙向鏈表結(jié)構(gòu),內(nèi)部是Node結(jié)構(gòu),外部是first、last首尾節(jié)點。
2、常見源碼
(1)構(gòu)造方法:
//無參構(gòu)造,有參構(gòu)造是將一個LinkedList對象傳入進行追加(數(shù)據(jù)復(fù)制) public LinkedList() { }
(2)add方法:
public boolean add(E e) { linkLast(e);//將e以尾插法入鏈表 return true; } //新數(shù)據(jù)入鏈表 void linkLast(E e) { final Node<E> l = last;//獲取尾節(jié)點 final Node<E> newNode = new Node<>(l, e, null);//調(diào)用Node構(gòu)造方法進行入鏈表 last = newNode;//修改最新尾節(jié)點 if (l == null)//判定是否為第一個鏈表節(jié)點 first = newNode;//設(shè)置為第一個節(jié)點 else l.next = newNode;//將新節(jié)點與舊節(jié)點相連 size++;//數(shù)量自增 modCount++;//操作鏈表自增 } //內(nèi)部類Node,用于鏈表底層數(shù)據(jù)存儲 private static class Node<E> { E item;//存儲值類型泛型 Node<E> next;//下一節(jié)點 Node<E> prev;//上一節(jié)點 //基于構(gòu)造方法進行鏈表構(gòu)造 Node(Node<E> prev, E element, Node<E> next) { this.item = element;//當(dāng)前節(jié)點存儲值 this.next = next;//設(shè)置當(dāng)前新節(jié)點的下一節(jié)點值 this.prev = prev;//設(shè)置當(dāng)前新節(jié)點的上一節(jié)點值 } }
(3)remove方法:
//列舉根據(jù)值刪除,不列舉按索引刪除remove,邏輯大體差不多 public boolean remove(Object o) { if (o == null) {//空值刪除 for (Node<E> x = first; x != null; x = x.next) { if (x.item == null) { unlink(x);//調(diào)用刪除方法 return true; } } } else { for (Node<E> x = first; x != null; x = x.next) { if (o.equals(x.item)) { unlink(x);//調(diào)用刪除方法 return true; } } } return false; } //刪除節(jié)點方法,將節(jié)點的前后節(jié)點進行連接,然后將自身置空,其中判定首節(jié)點和尾節(jié)點為空處理 E unlink(Node<E> x) { final E element = x.item;//刪除節(jié)點值 final Node<E> next = x.next;//刪除節(jié)點的下一節(jié)點 final Node<E> prev = x.prev;//刪除節(jié)點的上一節(jié)點 if (prev == null) {//上一節(jié)點那為空 first = next;//設(shè)置新的首節(jié)點 } else { prev.next = next;//將刪節(jié)點的前后鏈接(前節(jié)點) x.prev = null;//置空當(dāng)前節(jié)點的prev值 } if (next == null) {//刪除節(jié)點下一節(jié)點為空 last = prev;//設(shè)置新的尾節(jié)點 } else { next.prev = prev;//刪除節(jié)點的前后鏈接(針對后節(jié)點) x.next = null;//置空當(dāng)前節(jié)點的next值 } x.item = null;//置空當(dāng)前節(jié)點值 size--;//數(shù)量減一 modCount++;//操作次數(shù)自增 return element;//返回刪除節(jié)點值 }
(4)get方法:
public E get(int index) { checkElementIndex(index);//是否在正常范圍內(nèi),index>=0&&index<size return node(index).item;//返回指定索引節(jié)點值 } //根據(jù)索引值返回節(jié)點,根據(jù)二分法(折半)查找 Node<E> node(int index) { if (index < (size >> 1)) {//前半部分查找 Node<E> x = first;//首節(jié)點 for (int i = 0; i < index; i++) x = x.next;//獲得指定索引節(jié)點 return x;//返回節(jié)點 } else { Node<E> x = last;//尾節(jié)點 for (int i = size - 1; i > index; i--) x = x.prev;//從后往前查找,找到指定索引節(jié)點 return x;//返回節(jié)點 } }
(5)set方法:
//指定索引位置進行設(shè)值 public E set(int index, E element) { checkElementIndex(index);//檢查索引是否合法 Node<E> x = node(index);//獲取索引節(jié)點 E oldVal = x.item;//原索引節(jié)點值 x.item = element;//設(shè)值 return oldVal;//返回舊值 }
3、總結(jié)
(1)LinkedList是線程不安全,多線程環(huán)境會造成并發(fā)修改異常java.util.ConcurrentModificationException;
(2)LinkedList是一個雙向鏈表結(jié)構(gòu)(無擴容機制),內(nèi)部是Node,外部是首尾節(jié)點first、last。
到此這篇關(guān)于Java的List集合框架之LinkedList詳細解析的文章就介紹到這了,更多相關(guān)List集合框架之LinkedList內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot+Shiro實現(xiàn)一個Http請求的Basic認(rèn)證
本文向向大家仔細的介紹了如何使用Shiro實現(xiàn)一個Http請求的Basic認(rèn)證,有此需求的朋友可以參考下本文2021-06-06SpringBoot利用注解來實現(xiàn)Redis分布式鎖
有些業(yè)務(wù)請求,屬于耗時操作,需要加鎖,防止后續(xù)的并發(fā)操作,同時對數(shù)據(jù)庫的數(shù)據(jù)進行操作,需要避免對之前的業(yè)務(wù)造成影響。本文將利用注解來實現(xiàn)Redis分布式鎖,需要的可以參考一下2022-09-09Mybatis-plus如何通過反射實現(xiàn)動態(tài)排序不同字段功能
這篇文章主要介紹了Mybatis-plus如何通過反射實現(xiàn)動態(tài)排序不同字段功能,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02java數(shù)據(jù)庫開發(fā)之JDBC的完整封裝兼容多種數(shù)據(jù)庫
這篇文章主要介紹了java數(shù)據(jù)庫開發(fā)之JDBC的完整封裝兼容多種數(shù)據(jù)庫,需要的朋友可以參考下2020-02-02