Java的List集合框架之LinkedList詳細(xì)解析
(一)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詳細(xì)解析的文章就介紹到這了,更多相關(guān)List集合框架之LinkedList內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mybatis參數(shù)類型不匹配錯誤argument type mismatch的處理方案
這篇文章主要介紹了mybatis參數(shù)類型不匹配錯誤argument type mismatch的處理方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01
java線程中斷?interrupt?和?LockSupport解析
這篇文章主要為大家介紹了java線程中斷?interrupt?和?LockSupport示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02
關(guān)于Jackson的JSON工具類封裝 JsonUtils用法
這篇文章主要介紹了關(guān)于Jackson的JSON工具類封裝 JsonUtils用法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09

