總結 陣列在JDK中的應用

2021-10-05 21:24:22 字數 2102 閱讀 3056

從資料結構分類上陣列是是一種物理的資料結構,常見的物理結構還是鍊錶。陣列的定義就是:有限個相同型別的元素的有序集合,其特點是記憶體一般空間順序儲存,隨機訪問效率高(根據索引獲取元素),時間複雜度為o(1)。下面從時間複雜度上看陣列中的增、刪、查這個操作的時間複雜度;

陣列的基本用法

回到正題,筆者最近在看jdk1.8的原始碼,發下陣列在底層有廣泛的應用,因此用這篇文章記錄陣列的jdk原始碼進行了使用。因為陣列的在定義時候就需要確定長度,那麼陣列往往伴隨著個擴容的問題。本文也會對陣列在不同類中的初始容量,擴容的時機(什麼時候 出發擴容),擴容的機制(擴容後的容量為原來的多少倍)進行簡單的記錄,但是詳細的擴容細節就不過多分析。

private

final

char value;

//底層是用字元陣列存放資料,而且用final修飾

該類其實就是stringbuilder和stringbuffer的父類

char

value;

//底層也是用字元陣列儲存陣列,但是這裡不是用final修飾的

private entry[

] table;

//陣列儲存不同的threadlocal的資訊,entry為key-value形式的雜湊表

預設容量:16;

擴容時機:陣列元素超過陣列當前容量的三分之二;

擴容機制:擴容後的容量是原來容量的 2 倍;

transient object[

] elementdata;

//存放list元素的陣列(transient不參與序列化的過程)

預設容量:10;

擴容時機:陣列滿的時候;

擴容機制:擴容後的容量是原來容量的 1.5 倍;

transient node

table;

//存放資料的陣列

node型別可能為鍊錶中節點或者紅黑樹的節點

預設容量:16;

擴容時機:當前結合中元素大於(陣列當前容量*負載因子),負載因子是0.75。

擴容機制:為原來容量的兩倍;

private

transient entry<?,

?>

table;

entry是鍊錶節點型別

預設容量:11;

擴容時機:當前結合中元素大於(陣列當前容量*負載因子),負載因子是0.75。

擴容機制:為原來容量的兩倍再加1;(hashmap是原來的兩倍)

protected object[

] elementdata;

//儲存資料的元素

預設容量:10;

擴容時機:陣列滿的時候;

擴容機制:擴容後的容量是原來容量的 2 倍;(arraylist是1.5倍數)

棧,該類繼承於vector,所以底層也是用陣列實現的棧。該類注釋上提示如果需要佇列優先考慮使用者deque

基於陣列實現的雙端佇列

transient object[

] elements;

阻塞佇列

final object[

] items;

//佇列元素存放在該陣列中,陣列大小必須在初始化的時候賦值,沒有預設值

阻塞優先佇列,底層用陣列維護乙個最小堆資料結構

private

transient object[

] queue;

int newcap = oldcap +

((oldcap <64)

?(oldcap +2)

:// grow faster if small (小於64的時候擴容的比較快)

(oldcap >>1)

);

private

transient

volatile object[

] array;

//底層也是基於陣列,volatile修飾保證可見性

二叉堆在jdk中的應用

二叉堆最核心的操作是上浮和下沉。上浮是新增元素到隊尾元素,然後經過與上一級節點比較,將隊尾元素變動到合適的位置。下沉是頭結點元素,跟左右葉子節點比較,下沉到合適位置。簡單的 實現 public static void buildupheap int arr public static void bu...

Synchronized在JDK1 6中的優化

首先什麼是自旋鎖?有時候執行緒去競爭鎖失敗,進入了阻塞狀態,但剛剛進入阻塞狀態後持有鎖的執行緒就釋放了鎖資源,這個時候執行緒又會被喚醒繼續執行,考慮到這種情況,jdk1.4中引入了自旋鎖的概念,就是在sychronized同步 塊中,如果執行緒沒有競爭到鎖,則讓它先進行一段無意義的自旋,避免執行緒直...

JDK1 8中的陣列排序

根據不同的情況,選擇不同的排序演算法。1 當需要排列的元素較少的時候,採用普通的插入排序 當被排序的陣列長度小於47但排序不是從陣列起始位置開始的時候,那麼就會選擇哨兵插入排序的方式進行排序。這種情況主要是當sort被雙基準快排遞迴呼叫的時候才會使用 2 如果元素較多,大於插入排序的閾值,但是小於歸...