了解完了hashmap,今天來看一看hashset。
應該都知道list和set都實現自collection,list保證元素的新增順序,元素可重複。而set不保證元素的新增順序,元素不可重複。
上圖中可以得知set在collection家族中的位置,有兩個很重要的實現hashset和treeset。
乙個小例子
看第一行**
setstrset = new hashset<>();//new了乙個hashset
strset.add("張三");
進入原始碼看一看,
原來就是呼叫底層hashmap的put方法,把"張三"作為key,present作為value放在hashmap裡,hashmap中,如果put時key重了,會返回被覆蓋的value值(oldvalue),否則返回null,這兒的hashset又給包裝了一下,如果key沒有重(oldvalue == null),就返回true,否則返回false。
present又是什麼呢?
present只是乙個final的object。
此時的記憶體圖是這樣的。
依次再新增「李四」,「王五」,「趙六」,記憶體圖如下:
所有元素的value都指向object物件,hashset雖然底層是用hashmap來實現的,但由於用不到hashmap的value,所以不會為底層hashmap的每個value分配乙個記憶體空間,因此並不會過多的占用記憶體。
看下原始碼中的其他方法
這些方法基本上沒什麼邏輯**,就是復用了hashmap裡的方法而已。hashset就是利用hashmap來實現的。這時候我們大膽的猜測一下,treeset是不是也是用treemap來實現的呢?
還真是的,仔細看一些常用方法也是直接呼叫treemap的。
就不一一枚舉了,可以自己開啟原始碼看一下。
總結:
由於hashmap中的key是不能重複的,所以hashset中的值也不能重複,hashmap的儲存邏輯也保證了hashset的無序性。
treemap的底層是紅黑樹,紅黑樹中節點重複是直接覆蓋的,所以保證了teeeset的不可重複性,紅黑樹的儲存邏輯也保證了treeset的無序性。
hashset底層宣告了乙個hashmap,hashset做了一層包裝,操作hashset裡的元素時其實是在操作hashmap裡的元素。treeset底層也是宣告了乙個treemap,操作treeset裡的元素其實是操作treemap裡的元素。
sping AOP底層原理(詳解)
aop 面向切面程式設計,利用aop對業務邏輯各個方面進行隔離,從而使業務邏輯的各個方面耦合度進行降低,提高 的重用性,同時提高 的使用效率。底層原理 分兩種 1.有介面通過jdk動態 2.沒有介面通過cglib動態 jdk 動態 具體實現 通過使用proxy類的方法實現動態 1 呼叫newprox...
對HashSet儲存原理的理解
hashset的底層是直接呼叫hashmap來實現儲存,其值作為hashmap的值。解決的是唯一性 儲存資料,底層採用陣列 陣列可以遍歷,但是效率低下 所以,使用hash演算法,對儲存物件使用hashcode,然後跟陣列長度 1做位運算,得到儲存下標,沒有其他元素,直接儲存,不用比較。隨著元素不斷增...
ssL原理解密
rsa公鑰加密在計算機產業中被廣泛使用在認證和加密。可以從rsa data security inc.獲得的rsa公鑰加密許可證。公鑰加密是使用一對非對稱的密碼加密或解密的方法。每一 對密碼由公鑰和私鑰組成。公鑰被廣泛發布。私鑰是隱密的,不公開。用公鑰加密的資料只能夠被私鑰解密。反過來,使用私鑰加密...