HashSet的儲存方式以及記憶體洩露的原因

2021-08-08 11:52:40 字數 1389 閱讀 1127

在單鏈表集合

框架中,有兩大體系,乙個是set,乙個是list,簡單來說乙個是線性的乙個是非線性的

arraylist:集合的公升級版(順序表)

從上面可以看到我們初始化乙個arraylist物件就會包裝乙個長度為10的object的陣列

linkedlist :鏈式表

這上面我們可以看出來這個是通過內部類封裝node,以及通過泛型來實現儲存物件

arraylist我們去查詢已經儲存的物件根據索引查詢會特別快,而linkedlist由於是鏈式結構,只能儲存下乙個和上乙個的資訊,所以查詢會相對比較慢,但是arraylist的刪除和增加會特別慢,由於刪除或則增加乙個物件會影響後面所有物件的位置,而linkedlist進行刪除或者增加只會影響他前面和後面的物件

hashset:簡單來說就是順表表(陣列)加上鏈式表

而它的具體功能的實現是靠著hashmap的實現

hashset它進行儲存物件時,先根據物件的hash值來確定它的位置區域,然後通過equals去和相同hash值的物件去比較,如果為true則不進行儲存,如果是false,則進行鏈式儲存,為什麼要這樣來進行儲存呢?由於hashset儲存的是不同的物件,假設已經有了1000個物件,再新增乙個物件,我們需要比較一千次,極為麻煩,我們可以直接的通過hash值和equals來比較是否物件滿足我們相同的條件

上面可以看到bean1和bean4物件不同但是他們的hash值和equals所以沒有儲存進去,他的刪除方式也是一樣,先根據hash值去找相應的區域,再比較equals

當我們已經把物件儲存到hashset物件後,如果我們改變屬性值(這個屬性值影響hash值),導致我們在hashset物件找不到相應的物件最後導致記憶體溢位,因為物件無法被清理(有對應的指標)。

因為改變了屬性找不到對應的hash值,而確定不了物件的位置

HashSet資料儲存方式詳解

hashset資料儲存方式 下圖為乙個hashset陣列的結構和三個元素,演示儲存的過程 首先存入字串 abc 通過hashcode方法發現陣列裡沒有96354這個雜湊值,將這個雜湊值存入陣列,然後將元素 abc 以鍊錶的方式連線在對應的雜湊值陣列下 然後重複操作同樣存入元素 重地 最後,存入元素 ...

HashSet的儲存原理

hashset的底層用雜湊雜湊表來儲存物件 預設長度為16的陣列 假如 set set new hashset set.add obj 內部儲存過程為 定義h obj.hashcode,得到obj物件的雜湊碼h,再對h進行hash雜湊運算,對陣列長度進行求餘,假如長度為16,則返回乙個0 15之間的...

談談HashSet的儲存原理

hashset的儲存原理 1 將要傳入的資料根據系統的hash演算法得到乙個hash值 2 根據hash值可以得出該資料在hash表中的位置 3 判斷該位置上是否有值,沒有值則把資料插入進來 如果有值則再次判斷傳入的值與原值是否位址或equals相同,如果相同則不存,否則通過鍊錶的方式 儲存到該位置...