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...