Java的List集合框架之LinkedList詳細(xì)解析
(一)List子父層級(jí):

- List接口繼承于Collection,Collection繼承Iterable;
- LIst接口實(shí)現(xiàn)類分為:Vector、ArrayList、LinkedList;
(二)List實(shí)現(xiàn)類
1、LinkedList實(shí)現(xiàn)類
(1)LinkedList底層是內(nèi)部Node類的存儲(chǔ),prev、next、item值,同時(shí)最外層還有first、last節(jié)點(diǎn);
(2)LinkedList是線程不安全的,多線程環(huán)境會(huì)報(bào)并發(fā)修改異常java.util.ConcurrentModificationException。
(3)LinkedList無擴(kuò)容機(jī)制,底層是雙向鏈表結(jié)構(gòu),內(nèi)部是Node結(jié)構(gòu),外部是first、last首尾節(jié)點(diǎn)。
2、常見源碼
(1)構(gòu)造方法:
//無參構(gòu)造,有參構(gòu)造是將一個(gè)LinkedList對象傳入進(jìn)行追加(數(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é)點(diǎn)
final Node<E> newNode = new Node<>(l, e, null);//調(diào)用Node構(gòu)造方法進(jìn)行入鏈表
last = newNode;//修改最新尾節(jié)點(diǎn)
if (l == null)//判定是否為第一個(gè)鏈表節(jié)點(diǎn)
first = newNode;//設(shè)置為第一個(gè)節(jié)點(diǎn)
else
l.next = newNode;//將新節(jié)點(diǎn)與舊節(jié)點(diǎn)相連
size++;//數(shù)量自增
modCount++;//操作鏈表自增
}
//內(nèi)部類Node,用于鏈表底層數(shù)據(jù)存儲(chǔ)
private static class Node<E> {
E item;//存儲(chǔ)值類型泛型
Node<E> next;//下一節(jié)點(diǎn)
Node<E> prev;//上一節(jié)點(diǎn)
//基于構(gòu)造方法進(jìn)行鏈表構(gòu)造
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;//當(dāng)前節(jié)點(diǎn)存儲(chǔ)值
this.next = next;//設(shè)置當(dāng)前新節(jié)點(diǎn)的下一節(jié)點(diǎn)值
this.prev = prev;//設(shè)置當(dāng)前新節(jié)點(diǎn)的上一節(jié)點(diǎn)值
}
}
(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é)點(diǎn)方法,將節(jié)點(diǎn)的前后節(jié)點(diǎn)進(jìn)行連接,然后將自身置空,其中判定首節(jié)點(diǎn)和尾節(jié)點(diǎn)為空處理
E unlink(Node<E> x) {
final E element = x.item;//刪除節(jié)點(diǎn)值
final Node<E> next = x.next;//刪除節(jié)點(diǎn)的下一節(jié)點(diǎn)
final Node<E> prev = x.prev;//刪除節(jié)點(diǎn)的上一節(jié)點(diǎn)
if (prev == null) {//上一節(jié)點(diǎn)那為空
first = next;//設(shè)置新的首節(jié)點(diǎn)
} else {
prev.next = next;//將刪節(jié)點(diǎn)的前后鏈接(前節(jié)點(diǎn))
x.prev = null;//置空當(dāng)前節(jié)點(diǎn)的prev值
}
if (next == null) {//刪除節(jié)點(diǎn)下一節(jié)點(diǎn)為空
last = prev;//設(shè)置新的尾節(jié)點(diǎn)
} else {
next.prev = prev;//刪除節(jié)點(diǎn)的前后鏈接(針對后節(jié)點(diǎn))
x.next = null;//置空當(dāng)前節(jié)點(diǎn)的next值
}
x.item = null;//置空當(dāng)前節(jié)點(diǎn)值
size--;//數(shù)量減一
modCount++;//操作次數(shù)自增
return element;//返回刪除節(jié)點(diǎn)值
}
(4)get方法:
public E get(int index) {
checkElementIndex(index);//是否在正常范圍內(nèi),index>=0&&index<size
return node(index).item;//返回指定索引節(jié)點(diǎn)值
}
//根據(jù)索引值返回節(jié)點(diǎn),根據(jù)二分法(折半)查找
Node<E> node(int index) {
if (index < (size >> 1)) {//前半部分查找
Node<E> x = first;//首節(jié)點(diǎn)
for (int i = 0; i < index; i++)
x = x.next;//獲得指定索引節(jié)點(diǎn)
return x;//返回節(jié)點(diǎn)
} else {
Node<E> x = last;//尾節(jié)點(diǎn)
for (int i = size - 1; i > index; i--)
x = x.prev;//從后往前查找,找到指定索引節(jié)點(diǎn)
return x;//返回節(jié)點(diǎn)
}
}
(5)set方法:
//指定索引位置進(jìn)行設(shè)值
public E set(int index, E element) {
checkElementIndex(index);//檢查索引是否合法
Node<E> x = node(index);//獲取索引節(jié)點(diǎn)
E oldVal = x.item;//原索引節(jié)點(diǎn)值
x.item = element;//設(shè)值
return oldVal;//返回舊值
}
3、總結(jié)
(1)LinkedList是線程不安全,多線程環(huán)境會(huì)造成并發(fā)修改異常java.util.ConcurrentModificationException;
(2)LinkedList是一個(gè)雙向鏈表結(jié)構(gòu)(無擴(kuò)容機(jī)制),內(nèi)部是Node,外部是首尾節(jié)點(diǎn)first、last。
到此這篇關(guān)于Java的List集合框架之LinkedList詳細(xì)解析的文章就介紹到這了,更多相關(guān)List集合框架之LinkedList內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mybatis參數(shù)類型不匹配錯(cuò)誤argument type mismatch的處理方案
這篇文章主要介紹了mybatis參數(shù)類型不匹配錯(cuò)誤argument type mismatch的處理方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
Java中實(shí)現(xiàn)兩個(gè)線程交替運(yùn)行的方法
這篇文章主要介紹了Java中實(shí)現(xiàn)兩個(gè)線程交替運(yùn)行的方法,本文將給大家分享操作流程,通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-12-12
java線程中斷?interrupt?和?LockSupport解析
這篇文章主要為大家介紹了java線程中斷?interrupt?和?LockSupport示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
利用MultipartFile實(shí)現(xiàn)文件上傳功能
這篇文章主要為大家詳細(xì)介紹了利用MultipartFile實(shí)現(xiàn)文件上傳功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11
SpringBoot自動(dòng)裝配注解的實(shí)現(xiàn)示例
本文主要介紹了SpringBoot自動(dòng)裝配注解的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2026-04-04
關(guān)于Jackson的JSON工具類封裝 JsonUtils用法
這篇文章主要介紹了關(guān)于Jackson的JSON工具類封裝 JsonUtils用法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09

