基於JDK1 8的LinkedList剖析

2022-01-19 06:51:14 字數 1631 閱讀 4654

之前寫了一篇arraylist,那麼今天就寫一篇他的姊妹篇,linkedlist。

眾所周知,arraylist底層資料是陣列,可以在o(1)的時間內get到資料,但刪除和插入就要o(n)時間複雜度。

所以出現了鍊錶,鍊錶可以在o(1)的時間內插入,並且不會浪費記憶體,用多少就鏈結多少即可。

我們從以下幾個方面介紹linkedlist

1

private

static

class node

11 }

我們可以看出每個結點的組成部分有三個,乙個是item資料,乙個是prev前驅節點,乙個是next後驅節點。

那麼就可以知道linkedlist就是乙個雙向鍊錶,每個節點既有指向後面的鍊錶,也有指向前面的鍊錶。如下圖(畫的不好,見諒)

//最基本的add方法,其他方法都是這個方法的變體

2public

boolean

add(e e)

直接呼叫了linklast方法(也就是說,add方法是預設插入到鍊錶的尾端),然後return 乙個 true。

1

void

linklast(e e)

我們知道add方法是在佇列尾部新增元素,還是很容易的。首先用變數 l 指向最後乙個節點,然後建立乙個節點將它的prev指向 l ,這樣newnode成為最後乙個節點,使用last指向它,接著使 l 的next指向newnode,這種直接新增在佇列尾部的方式還是很好理解的,我們重點看看如何新增在佇列的中間位置。

1

public

void add(int

index, e element)

直接看注釋。在呼叫linkbefore之前,呼叫了node(index)確定插入的位置

1 nodenode(int

index) else

15 }

首先判斷在前半部分還是在後半部分,然後乙個for迴圈查詢。時間複雜度o(n), 沒辦法,鍊錶的缺點。

1

void linkbefore(e e, nodesucc)

看完了新增,刪除就顯得簡單些,無非分為兩種,從頭部刪除,從中間刪除,從頭部刪除和從尾部新增一樣簡單,從中間刪除就是把此結點的前乙個結點的next指向此結點的後乙個結點,並把後乙個結點的prev指向此節點的前乙個結點,就是跳過此結點,最終將此結點null交給gc大人解決。為了篇幅,我們不再贅述。

由於linkedlist是鍊錶,get方法必須掃瞄一遍鍊錶,效率極低,所以謹慎使用。

1

public e get(int

index)

從源**中我們可以清晰的看到,所謂的get方法也就是,呼叫node方法遍歷整個鍊錶,只是其中稍微做了點優化,如果index的值小於size/2從頭部遍歷,否則從尾部遍歷。可見效率一樣低下,所以我們以後寫程式的時候,如果遇到資料量不大但是需要經常遍歷查詢的時候使用arraylist而不是linkedlist,如果資料量非常的大,但是不是很經常的查詢時使用linkedlist。

HashMap原始碼分析 基於jdk1 8

初始化 描述 hashmap構造方法一公共有4個,分別如下 無參構造 public hashmap 給定初始容量 param initialcapacity public hashmap int initialcapacity 指定初始容量和載入因子 param initialcapacity pa...

Stack原始碼解析 基於JDK1 8

總結public class stack extends vector stack繼承自vector,所以是執行緒安全的。public synchronized e pop public synchronized e peek public e push e item public synchron...

jdk1 8常用總結

1.查詢集合裡的第乙個物件 filter 例 查詢listlist 中username為小明的物件t list.stream filter findfirst 1 list.stream filter e 小明 equals e.getusername findfirst 2.查詢滿足條件的物件,並...