深入Java集合系列之二 LinkedList

2021-07-10 19:16:37 字數 1485 閱讀 4693

前言

linkedlist底層使用的雙端鍊錶,即每個節點既包含指向其後繼的引用也包括指向其前驅的引用,linkedlist實現了list介面,繼承了abstractsequentiallist類,在頻繁進行插入以及刪除的情況下效率較高。

linkedlist使用較多的是add、get和remove,原始碼的分析也將對這三個方法進行分析。

add方法

先看add方法:

public boolean add(e e) 

void linklast(e e)

可以看出,插入乙個節點非常快,直接找到該位置的節點,修改節點的前驅以及後繼的引用即可

get方法

下面看看get方法:

public e get(int index) 

//獲取index位置上的節點

nodenode(int index) else

}//檢查index值的合法性

private void checkelementindex(int index)

//判斷index是否存在於鍊錶中

private boolean iselementindex(int index)

可以看出獲取index節點的值要從頭或尾遍歷鍊錶,當資料量很大的時候,效率無疑是低下的

remove方法

最後看看remove操作:

public e remove(int index) 

e unlink(nodex) else

//如果後繼為null則要移除的是最後乙個節點,則把last的引用指向x節點的前驅就ok

if (next == null) else

//把x節點的值設為null,這樣x就沒有任何引用了,gc處理

x.item = null;

//把鍊錶的size減少1

size--;

//結構性修改的次數增加1

modcount++;

//返回x節點的值,在移除之前已經儲存在element中了

return element;

}

linkedlist小結

linkedlist是基於雙向迴圈鍊錶實現的,除了可以當做鍊錶來操作外,還可以當做棧、佇列和雙端佇列使用(⊙o⊙)哦。同樣是非執行緒安全的。

基於雙端迴圈鍊錶,並且頭節點不存放資料

在查詢和刪除元素的時候,分為元素null和不為null進行處理,允許元素為空

不存在容量不足的問題

entry entry(int index)方法返回制定位置處的節點,使用加速動作。原始碼中先將index與長度size的一半(size >> 2)比較,如果index更小,那麼就從位置0開始遍歷到inde處,否則從size位置往前遍歷,這樣可以減少一部分不必要的遍歷。實際上提高的效率有限。

linkedlist是基於鍊錶實現的,插入刪除效率比較高,查詢效率低。

redis集合系列之二

目錄 srem smove scard 1.語法 srem key member member.2.解析 移除集合key中的乙個或多個member元素,不存在的member元素會被忽略 當key不是集合型別時,返回乙個錯誤 2.4之前 只接受單個member值 3.返回值 被成功移除的元素的數量,不...

java 集合類List系列 二

現討論一下以下的問題 如果需要刪除 重複的元素那該如何處理?list.add new student 張三 23 list.add new student 張三 23 list.add new student 李四 24 list.add new student 張三 23 list.add new...

Java總結篇系列 集合(二)

arraylist和vector的區別 1.相同點 a.都是繼承自collection介面,即儲存的元素都是有序的可重複的。2.不同點 a.arraylist 是執行緒不安全的,設計的主要目的是提公升單執行緒操作時的效率,vector從設計初衷就能看出是為了多執行緒操作。類似的有hashmap和ha...