java list集合分析_Java集合源碼分析之LikedList

一、LinkedList結構

778316f8cf2707e98e89a9932f9ff4a7.png

LinkedList是一種可以在任何位置進行高效地插入和移除操作的有序序列,它是基於雙向鏈表實現的。

LinkedList 是一個繼承於AbstractSequentialList的雙向鏈表。它也可以被當作堆棧、隊列或雙端隊列進行操作。

LinkedList 實現 List 接口,能對它進行隊列操作。

LinkedList 實現 Deque 接口,即能將LinkedList當作雙端隊列使用。

LinkedList 實現了Cloneable接口,即覆蓋了函數clone(),能克隆。

LinkedList 實現java.io.Serializable接口,這意味着LinkedList支持序列化,能通過序列化去傳輸。

LinkedList 是非同步的。

二、源碼說明

1.LikedList屬性

//LinkedList的屬性非常簡單,一個頭結點、一個尾結點、一個表示鏈表中實際元素個數的變量。//注意,頭結點、尾結點都有transient關鍵字修飾,這也意味着在序列化時該域是不會序列化的。//元素個數

transient int size = 0;//頭結點

transient Nodefirst;//尾節點

transient Node last;

2.構造函數

publicLinkedList() {

}public LinkedList(Collection extends E>c) {this();

addAll(c);

}

LinkedList沒有長度的概念,所以不存在容量不足的問題,因此不需要提供初始化大小的構造方法,因此只提供了兩個方法,一個是無參構造方法,初始一個LinkedList對象,一個是將指定的集合元素轉化為LinkedList構造方法。

3.添加方法 add()

public booleanadd(E e) {

linkLast(e);return true;

}voidlinkLast(E e) {final Node l =last;final Node newNode = new Node<>(l, e, null);

last=newNode;if (l == null)

first=newNode;elsel.next=newNode;

size++;

modCount++;

}

添加方法默認是添加到LinkedList的尾部,首先將last指定的節點賦值給l節點,然后新建節點newNode ,此節點的前驅指向l節點,data = e , next = null , 並將新節點賦值給last節點,它成為了最后一個節點,根據當前List是否為空做出相應的操作。若不為空將l的后繼指針修改為newNodw。 size +1 , modCount+1

4.刪除方法

public booleanremove(Object o) {if (o == null) {for (Node x = first; x != null; x =x.next) {if (x.item == null) {

unlink(x);return true;

}

}

}else{for (Node x = first; x != null; x =x.next) {if(o.equals(x.item)) {

unlink(x);return true;

}

}

}return false;

}

刪除方法,先循環遍歷列表,找到item == o 的節點,在調用unlink()方法刪除

5.查詢 get(index)

//獲取指定位置的元素

public E get(intindex) {

checkElementIndex(index);returnnode(index).item;

}//返回指定位置的節點信息,//LikedList無法隨機訪問,只能通過遍歷的方式找到相應的結點//為了提高效率,當前位置首先和元素的中間位置開始判斷,小於中間位置//從頭結點開始遍歷,大於中間位置從尾結點開始遍歷

Node node(intindex) {//assert isElementIndex(index);

if (index < (size >> 1)) {

Node x =first;for (int i = 0; i < index; i++)

x=x.next;returnx;

}else{

Node x =last;for (int i = size - 1; i > index; i--)

x=x.prev;returnx;

}

}

三、內部類介紹

在LinkedList中除了有一個Node的內部類外,應該還能看到另外兩個內部類,那就是ListItr,還有一個是DescendingIterator。

1.ListItr內部類

effbd1fc5eeed5a3e55d8f660834313f.png

看到方法名之后,就發現不止有向后迭代的方法,還有向前迭代的方法,所以我們就知道了這個ListItr這個內部類干嘛用的了,就是能讓linkedList不光能像后迭代,也能向前迭代。

看一下ListItr中的方法,可以發現,在迭代的過程中,還能移除、修改、添加值得操作。

2.DescendingIterator內部類

//看一下這個類,還是調用的ListItr,作用是封裝一下Itr中幾個方法,讓使用者以正常的思維去寫代碼,例如,在從后往前遍歷的時候,

//也是跟從前往后遍歷一樣,使用next等操作,而不用使用特殊的previous。private class DescendingIterator implements Iterator{private final ListItr itr = newListItr(size());public booleanhasNext() {returnitr.hasPrevious();

}publicE next() {returnitr.previous();

}public voidremove() {

itr.remove();

}

}

四、總結

LinkedList是一個功能很強大的類,可以被當作List集合,雙端隊列和棧來使用。linkedList本質上是一個雙向鏈表,通過一個Node內部類實現的這種鏈表結構。

能存儲null值,在查找和刪除某元素時,源碼中都划分為該元素為null和不為null兩種情況來處理,LinkedList中允許元素為null。

在實現的接口中,應該注意到沒有RandomAccess:那么就推薦使用iterator,在其中就有一個foreach,增強的for循環,其中原理也就是iterator,我們在使用的時候,使用foreach或者iterator都可以。

LikedList是順序存取結構(注意和隨機存取結構兩個概念搞清楚)

LinkedList在1.8版本有添加了一點新的內容,添加了一個static final 修飾的內部類LLSpliterator 並實現了Spliterator ,

LinkedList底層使用鏈表來保存集合中的元素,因此隨機訪問的性能較差,但是插入刪除時性能非常的出色。

參考

https://www.cnblogs.com/zhangyinhua/p/7688304.html

https://my.oschina.net/90888/blog/1625505

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值