從資料結構分類上陣列是是一種物理的資料結構,常見的物理結構還是鍊錶。陣列的定義就是:有限個相同型別的元素的有序集合,其特點是記憶體一般空間順序儲存,隨機訪問效率高(根據索引獲取元素),時間複雜度為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 如果元素較多,大於插入排序的閾值,但是小於歸...