java資料結構總結

2021-08-18 07:46:39 字數 1938 閱讀 2277

arraylist是基於陣列實現的乙個集合

隨機訪問速度快,迴圈到某乙個下標時停止。

插入速度較慢,迴圈到某乙個下標時插入乙個新資料,然後將後面資料的下標+1

更新速度快,迴圈到某一下標時更新當前資料

刪除速度較慢,同插入原理,需要更新刪除點後的其它資料下標。

初始化預設長度為10,可以指定size大小。長度遞增為:舊容量*3/2+1

構造方法可以接收乙個int型引數來做為初始容量

容量擴充套件是基於陣列複製實現的

linkedlist是乙個鍊錶。

其特點是插入速度快,插入時只需要將前乙個物件連線到新資料上將新資料連線到後乙個物件上既可。

查詢速度較慢,因為每乙個值都有乙個自己的位址。

更新速度較慢,因為查詢速度較慢。

隨機訪問速度慢,因為要尋找這個值所物件的位址。

刪除速度較快,只需要將前乙個節點連線到後乙個節點上既可。

vector是乙個執行緒安全的arraylist(方法上強制使用synchronized)

繼承自vector實現的先進後出的棧。

執行緒安全,基於synchronized實現執行緒同步。

基於陣列實現的乙個先進先出的佇列。

執行緒不安全。

1.7是基於陣列+鍊錶的形式實現,1.8使用node陣列實現,當同乙個hash值超過8個時會轉成紅黑樹。

預設大小為16,預設載入因子是0.75

當key的hash值有衝突時,以鍊錶的形式追加到value的後面

閥值=容量*載入因子,擴容等於=原始容量*2

擴容時機為儲存後擴容

一種執行緒安全的hashmap。

put、get、remove、putall、clear等大部分方法使用synchronized進行強制同步

基於hashmap的key實現的一種不重複的資料結構。

1.hashset的子類,其實現是呼叫了hashset構造linkedhashmap方法,來實現有序set。

1.7版本

segment:桶,用來裝載每個小table的鎖,繼承自reentrabntlock,對資料的put先呼叫segment的put方法

使用分段鎖機制,將乙個entry table分離在多個segment中

先使用trylock來獲取鎖,如果達到重試次數仍未獲取鎖,則使用segment繼承的reentrantlock類中的lock方法來獲取鎖,如果鎖已被占用則等待。

value使用了volatile保證記憶體可見,實現無鎖讀。

計算size,先採用無鎖方法計算三次每個segment中元素個數,如果三次資料一致則表示正確,如果不一致剛給每個sgement加鎖重新計算。

1.8版本

使用synchronized鎖單個節點。put時使用cas原理來保證執行緒安全

當相同的hash值超過8個時自動轉換成紅黑樹的結構儲存。

使用 volatile型別的變數basecount來記錄元素的個數,然後使用cas來修改basecount的值,如果修改失敗則使用countercall來記錄元素個數。

如果countercall元素為空則初始化通過cas來設定cellsbusy欄位,只有成功的執行緒才可以設定countercall欄位

當修改cellsbusy失敗時則繼承使用cas設定basecount,如果設定失敗則繼承設定countercall。

基於array陣列實現的乙個執行緒安全的佇列。

執行緒同步是基於reentrantlock可重入鎖實現執行緒安全。

基於condition實現佇列等待和喚醒。

如果佇列已滿offer方法會直接返回false,put方法會進行執行緒阻塞。

如果隊列為空poll方法會直接返回null值,take方法會進行執行緒阻塞。

基於陣列複製實現的乙個執行緒安全的arraylist

每次add時會複製乙個資料出來,將新元素放入到新陣列尾部,然後將原來的引用指向新陣列。

適用於讀多於寫的場景,並不會因為執行緒修改資料而影響到讀。

JAVA總結(資料結構 集合)

集合 特點 可變長度 collection介面 1 子介面 list 特點 有序 可重複 實現類 arraylist 1 新增 add object obj add int i,object obj addall collection c addall int i,collection c 2 修改...

Java資料結構之線性資料結構總結(一)

我們學習的資料結構都是從線性資料結構開始的,深刻理解線性資料結構非常必要。陣列我們可以理解為乙個強物理概念在計算機執行世界的乙個對映,是乙個物理世界到軟體工程呈現的結果,即連續的儲存空間在程式語言中的呈現。所以我們經常將陣列與鍊錶或者程式語言中的引用作對比。由於資料資料儲存一般是乙個連續的儲存空間,...

Java資料結構

arraylist 基於 array,在記憶體中占有連續空間,所以get index 時候,根據陣列首位址 偏移量就可以取到值 linklist 基於link,在記憶體中不連續,每個元素只知道下乙個元素,所以get時候,只能從首元素開始乙個乙個去找,效率相對較慢 增加刪除 arraylist 需要變...