集合操作總結日誌

2022-08-31 02:39:12 字數 3864 閱讀 6328

1.

集合: 

命名空間system.collection

a) 集合常用操作: 增刪改查 遍歷 來自於ilist介面

b) 就是乙個能裝一堆東西的容器. 而變數是乙個能裝一件東西的容器

i. arraylist arr=new arraylist(); 可變長度陣列,使用類似於陣列, 在新增第乙個 元素 的時候 ,給陣列擴容預設4個長度,再以後每一次新增元素超過陣列長度時,就將實際新增數量賦給陣列的長度.(比如陣列長度現在是4,你要新增6個元素,這樣一共為10個元素,陣列這是不是擴容2次變為16的長度,而是只擴容一次,然後將元素的實際長度賦給陣列的長度)

1. 屬性:    capacity:總容量  count:數量

2. addrange(icollection );實現原理: 先擴容,然後呼叫 array.copyto();方法 存入新資料.  

3. arr.capacity=200; 建立乙個200大小的陣列 然後用新陣列 替換 舊陣列.

4. remove() 是根據引用來刪除元素的. remove()中查詢刪除物件時的比較方法是object裡 預設的的equals,比較方式是比較的 位址. 可以使用者自定義比較型別 重寫remove()方法.

5. toarray(); 直接獲得arraylist 中的陣列 返回乙個object陣列

6. hashtable(key,value): hashtable裡的鍵不可以重複, 儲存鍵的時候通過hashcode 查詢儲存位址,從而找到對應的值.

a) hash演算法:能夠快速定位物件. 按照hash碼取值

b) (存)

當我們向hashtable中add元素時,元素儲存在hashtable的陣列裡的,下標是根據新增key的hash值算出來的(但因為hash值 取餘 arr.length(陣列長度),所以肯定不會超過當前陣列長度) !!!       hashtable 儲存元素時,是根據key的hash值(hash值是通過gethashcode()算出來的) %(取餘)  陣列長度 求出的乙個下標值

1.獲得key的雜湊值.

2.用雜湊值取餘陣列長度 獲得乙個下標index

3.建立乙個bucket物件,並設定3個成員值,添

加到index位置

4.注意

:每個物件算出的hashcode並不是唯一

的,有可能出現多個物件的hashcode相同.

a) 解決機制: 1.再次hash一次. 2.桶裝模

式,將兩個相同hashcode的物件裝入同

一位置.

5.當新增時,hashtable裡的容器陣列已經滿

了,則以陣列兩倍的長度擴容.

(取) : 

當我們從hashtable取元素時(根據key來取),會根據key的hash值算出 對應要取元素的下標,並且比較元素裡的key和當前要找的key引數的hash值是否相等,同時還要比較兩個key的引用是都一致,如果都滿足,則確定找到要取的元素

總結: 

存 : 會根據key的 hash值 算出乙個下標, 然後存

取 : 會根據key的 hash值,算出乙個下標, 然後取

取值得時候不需要遍歷, 算出來下標直接取.

雜湊表hashtable實現原理

:hashtable中的實際資料都儲存在乙個內部的buket陣列中,當使用者希望取得hashtable值得時候,hashtable進行如下處理:

1.為了保證取值範圍儲存在 0--buket.length之間, 首先雜湊演算法根據鍵key 與陣列長度length 進行取模運算,算的實際資料的位置為: (f(k)=hashof(k) % array.length)  至於這個雜湊函式hash(f)怎麼算出來的,簡單說,可以取關鍵字的ascii碼,根據一定規則運算得到.

2.如果發現多個key值得雜湊值重複,

3.當插入的資料達到

hashtable容量的上限時,對 內部buket陣列進行擴容(重新new乙個更大的陣列,然後把資料copy過去,最後將新陣列的位址引用再付給舊陣列)

4.隨著插入的資料項逐漸增多, hashtable 

內部陣列剩餘的空位也越來越少

, 下一次衝突的可能性也越來越多嚴重影響效率

. 因此不能等到陣列全部塞滿後才進行擴容處理

. 在 

.net 中, 

當插入資料個數和陣列容量之比為 

0.72 時, 

就開始擴容

. 這個 

0.72 

稱為裝填因子 

- load factor. 

這是乙個要求苛刻的數字

, 某些時刻將裝填因子增減 

0.01, 

可能你的 

hashtable 

訪問效率就提高或降低了 

50%, 

其原因是裝填因子決定 

array.length, array.length 

影響 f(k) 

的衝突機率

, 進而影響了效能

. 0.72 

是 microsoft 

經過長期實驗得出的乙個比較平衡的值

. (取什麼值合適和 

f(k) 

的演算法也有關

, 0.72 

不一定適合其他結構的雜湊表)5.

hashtable 的初始容量 

array.length 

至少為 

11, 

再次擴容的容量至少為 

"不小於 

2 倍於當前容量的乙個質數

". 這裡舉乙個例子

, 方便大家看看 

hashtable 

是多麼浪費空間

.假設以預設方式初始化乙個 hashtable, 

依次插入 

8 個值

, 由於 

8 / 0.72 > 11, 

因此 hashtable 

自動擴容

, 新的容量為不小於 

11 * 2 

的質數, 

即 23. 

所以, 

實際僅有 

8 個人吃飯

, 卻不得不安排一桌 

23 個座兒的酒席

, 十分奢侈

. 避免如此鋪張的途徑是在初始化 

hashtable 

時用帶參構造方式直接指定 

capacity 

為 17, 

但即便這樣仍浪費了 

9 個空間

.有心的讀者經過計算, 

可能會問為什麼不是指定初始容量為 

13, 13 

是質數啊

, 13 * 0.72 > 8 啊. 

確實理想情況是這樣

, 但實際上由於動態計算並判斷乙個數是否質數需要大量時間

, 故 

.net hashtable 

中的 capacity 

值是內部預設的乙個數列

, 只能為 

3, 7, 11, 17, 23... 

所以十分遺憾

. (注

: 只有當 

array.length > 0x6dda89 

時動態計算擴容容量

, 正常情況下我們不會存如此多的資料進去

).net 的 

hashtable 

就是以這種方式來減少衝突

, 以犧牲空間為代價換取讀寫速度

. 假設你在實際開發中對記憶體空間要求很敏感

, 譬如開發 

asp.net 

超大型 

b/s 

**時, 

就十分有必要檢討使用 

hashtable 

的場景需求

, 有的時候能否換個方式

, 採取自定義 

struct, 

或者陣列來高效實現呢

?

Python set集合型別操作總結

lst 1,2,3,4,1 print list set lst 1,2,3,4 set 1,2,3,4 t.add x 新增一項 s.update 10,37,42 在s中新增多項 t.remove h 刪除一項 len s set 的長度 x in s 測試 x 是否是 s 的成員 x not ...

集合 Collection集合總結

list有序,可重複 abstractlist 父類abstractcollection抽象類,實現了list介面 arraylist 父類abstractlist 底層資料結構是陣列,查詢快,增刪慢。執行緒不安全,不同步,效率高 vector 父類abstractlist 底層資料結構是陣列,查詢...

集合的一些操作總結

集合的特性 1.去重,2.無序,3.關係測試 集合建立 set 方法,列表list 集合的關係測試 並集 list 1.union list 2 or 交集 list 1.intersection list 2 or 差集 list 1.difference list 2 or list 1 lis...