在學習和面試中,經常會遇到關於集合記憶體的問題,我以乙個初學者的身份,分析一下關於各個型別集合的記憶體的變化。
集合的頂層介面為collection和map,而collection則有兩個子介面,分別是list和set,其中list為有序介面;set為無序介面。list中常用的集合為arraylist,vector;set中常用的為hashset。map中常用的有hashmap和hashtable。
因本文主要描述記憶體的問題,因此不過多描述各類集合之間的區別。
arraylist為有序的集合,他的底層資料結構是陣列,預設初始容量為10。也就是說,在建立出乙個arraylist集合,且不定大小時,會建立乙個大小為10的陣列作為容器。在往集合新增元素時會進行判斷,容量是否已經滿了,如果裝滿了,arraylist的容量會擴大為原來的1.5倍,實際上是建立乙個新的陣列,容量為原來的1.5倍,然後將原陣列中的元素依次放置到陣列中。
vector也是有序的集合,底層也同樣是陣列,預設的初始容量也是10。他與arraylist的不同點在於,vector在容量裝滿時容量變化為原來的2倍。
hashmap是abstracmap的子類,map的實現類,他儲存資料是基於陣列和鍊錶實現的。在儲存資料時,首先會呼叫hashcode()方法根據他的key值計算出乙個雜湊碼,再使用這個雜湊碼對陣列長度取模,得出的值存在在陣列中,如果得出的值已經存在,則會判斷value是否相等,如果相等則覆蓋,如果不相等則將資料儲存在該位置延伸出來的鍊錶上。
hashmap的預設初始長度為16,負載因子為0.75,當陣列的內容達到長度的75%時,陣列就會進行擴容,達到原來的兩倍。他在擴容是同樣是建立乙個新的兩倍長度的陣列,然後將原來的元素的hashcode按新的陣列長度取模,放置在陣列或鍊錶上。
hashtable是dictionary的子類,map的實現類,他儲存資料的原理與hashmap相同,不同的是,hashtable的預設初始長度為11,負載因子也為0.75。
hashset的底層儲存實際上是依靠hashmap實現的,hashset儲存的key,將key的hashcode對陣列長度取模放置在相應位置,當有相同的值時就覆蓋,所以hashset是無序且元素無法重複的。hashset的初始長度為16,負載因子0.75。
最後再提一下負載因子。負載因子相當於乙個閾值,當陣列的內容達到這個閾值,即內容》=負載因子×陣列長度時,發生擴容。負載因子設定越高,對陣列的利用就會越高,鍊錶的長度就會越長,查詢的效率就會越低,一般情況使用預設的0.75。
以上就是全部內容,敬請批評指正。
List Set 集合概述
asp.net android ios開發 net培訓 期待與您交流!1 集合基本概念 collection定義了集合框架的共性功能。1 新增 add e addall collection 2 刪除 remove e removeall collection clear 3 判斷。contains...
Set集合概述
1 set集合 理解 1 set集合的特點 無序,唯一 2 hashset集合 掌握 a 底層資料結構是雜湊表 是乙個元素為鍊錶的陣列 b 雜湊表底層依賴兩個方法 hashcode 和equals 執行順序 首先比較雜湊值是否相同 相同 繼續執行equals 方法 返回true 元素重複了,不新增 ...
java集合概述()
主要分為兩大類 collection和map collection介面實現了iterable介面 超級介面 iterable主要提供以下的方法 iterator iterator 返回乙個在一組 t 型別的元素上進行迭代的迭代器。collection介面主要提供以下方法 booleanadd e e...