資料結構 學習

2021-10-11 18:59:45 字數 1571 閱讀 8627

外部學習資料位址

一、描述

1. arraylist 是最常用的list 實現類,內部是通過陣列實現的,它允許對元素進行快速隨機訪問。

2. 陣列的缺點是每個元素之間不能有間隔,當陣列大小不滿足時需要增加儲存能力,就要將已經有陣列的資料複製到新的儲存空間中。

3. 當從arraylist 的中間位置插入或者刪除元素時,需要對陣列進行複製、移動、代價比較高。因此,它適合隨機查詢和遍歷,不適合插入和刪除。

// arraylist 的 add 方法

public

boolean

add(e e)

二. 執行緒安全問題

有兩個 先上**

1. 在多個執行緒進行add操作時可能會導致elementdata陣列越界

1. 列表大小為9,即size=9

2. 執行緒a開始進入add方法,這時它獲取到size的值為9,呼叫ensurecapacityinternal方法進行容量判斷。

3. 執行緒b此時也進入add方法,它獲取到size的值也為9,也開始呼叫ensurecapacityinternal方法。

4. 執行緒a發現需求大小為10,而elementdata的大小就為10,可以容納。於是它不再擴容,返回。

5. 執行緒b也發現需求大小為10,也可以容納,返回。

6. 執行緒a開始進行設定值操作, elementdata[size++] = e 操作。此時size變為10。

7. 執行緒b也開始進行設定值操作,它嘗試設定elementdata[10] = e,而elementdata沒有進行過擴容,它的下標最大為9。於是此時會報出乙個陣列越界的異常arrayindexoutofbound***ception.

2. 乙個執行緒的值覆蓋另乙個執行緒新增的值

1. 列表大小為0,即size=0

2. 執行緒a開始新增乙個元素,值為a。此時它執行第一條操作,將a放在了elementdata下標為0的位置上。

3. 接著執行緒b剛好也要開始新增乙個值為b的元素,且走到了第一步操作。此時執行緒b獲取到size的值依然為0,於是它將b也放在了elementdata下標為0的位置上。

4. 執行緒a開始將size的值增加為1

5. 執行緒b開始將size的值增加為2

多執行緒情況下 操作同乙個集合

vector 與arraylist 一樣,也是通過陣列實現的,不同的是它支援執行緒的同步,即某一時刻只有乙個執行緒能夠寫vector,避免多執行緒同時寫而引起的不一致性,但實現同步需要很高的花費,因此,訪問它比訪問arraylist 慢。

linkedlist 是用鍊錶結構儲存資料的,很適合資料的動態插入和刪除,隨機訪問和遍歷速度比較慢。

另外,他還提供了list 介面中沒有定義的方法,專門用於操作表頭和表尾元素,可以當作堆疊、佇列和雙向佇列使用。

解決 執行緒不安全的問題  都可以用

1. collections.synchronizedlist();

collections.synchronizedset();

2. 使用 vector

資料結構學習

什麼是資料結構 對計算機記憶體中的資料的一種安排。資料結構有那些?優缺點?1.陣列 插入快 知道下標 查詢慢,刪除慢,大小固定 2.有序陣列 比無序的查詢塊,刪除和插入慢,大小固定 3.棧 吃多了吐 個人理解 4.佇列 吃多了拉 個人理解 5.鍊錶 插入快,刪除快,查詢慢 6.二叉樹 查詢 插入 刪...

資料結構學習

鍊錶 class listnode definit self,x self.val x 節點值 self.next none 後繼節點值 例項化節點 n1 listnode 4 節點head n2 listnode 5 n3 listnode 1 構建引用指向 n1.next n2 n2.next ...

資料結構學習

這學期還是下定決心打算考研了,現在已經定好學校和專業。因為是跨考,所以打算早點開始專業課。我考的那個學校計算機技術專業需要考 資料結構 作業系統 計算機網路 個人認為,資料結構和作業系統是很基礎的東西,如果學好了對於學其他東西都會有很大幫助,所以我打算從資料結構開始。因為c語言剛開始一直是跟著郝斌老...