150天打卡Day25_集合深度解析 - Set接口
Collection子接口之二:Set接口
Set接口沒有提供額外的方法,使用Collection里的方法
Set集合無序不可重復(fù),如果試著把兩個相同的元素加同一個set集合,則操作失敗
Set判斷兩個對象是否相同不用==,用equals()方法
無序性和不可重復(fù)性的理解
無序性
不等于隨機(jī)性,以HashSet為例說明
存儲的數(shù)據(jù)不按照數(shù)組索引的順序挨個添加,而是根據(jù)添加元素的哈希值決定添加在數(shù)組的存儲位置
不可重復(fù)性
保證添加的元素按照equas()方法判斷時,不能返回true,即相同的元素只能添加一個
HashSet,LinkedHashSet,TreeSet異同
相同
均實現(xiàn)了Set接口,擁有Set接口所有的特性
不同
HashSet:是Set接口的主要實現(xiàn)類,線程不安全,可以存儲null值
LinkedHashSet:作為HashSet的子類,由于鏈表的關(guān)系,遍歷其內(nèi)部數(shù)據(jù)時,可以按添加順序去遍歷
TreeSet:底層是紅黑樹,添加時只能添加同一個類new的對象,可以按照添加對象的指定屬性進(jìn)行排序
HashSet源碼分析
HashSet特點介紹
HashSet底層結(jié)構(gòu)是數(shù)組加鏈表,
HashSet元素添加過程
我們向HashSet中添加元素a,首先調(diào)用元素a所在類的hashCode()方法,計算元素a的哈希值,根據(jù)此哈希值通過某種算法計算出在HashSet底層存放的位置,判斷在該位置上是否已經(jīng)有元素
如果該位置上沒有元素,那么元素a添加成功
如果該位置上有其他元素,或以鏈表形式存在的多個元素,則比較元素a與這些元素的哈希值,如果哈希值不相同,以鏈表的形式追加到后面,如果哈希值相同,則還要調(diào)用元素a所在類的equals()方法進(jìn)行判斷,返回true則證明相同,添加失敗,返回false則證明不相同,則以鏈表的形式追加到后面
底層HashSet添加元素其實是添加了HashMap的key,value是定義的一個靜態(tài)常量,沒有實際意義
HashSet底層其實就是HashMap,其他Set實現(xiàn)類同理
LinkedHashSet源碼分析
LinkedHashSet作為HashSet的子類,在添加數(shù)據(jù)的同時,每個數(shù)據(jù)還維護(hù)了兩個引用,記錄此數(shù)據(jù)前一個數(shù)據(jù)和后一個數(shù)據(jù),優(yōu)點,對于頻繁的遍歷操作,優(yōu)于HashSet
TreeSet源碼分析
添加時只能添加同一個類new的對象,可以按照添加對象的指定屬性進(jìn)行排序
兩種排序方式,自然排序和定制排序
自然排序中,TreeSet比較兩個對象是否相同的標(biāo)準(zhǔn)為compareTo()方法返回0,不再是equals()