Java之Set集合使用
阿新 • • 發佈:2019-02-02
2.Set使用場景
API介紹:
java.util.Set介面和java.util.List介面一樣,同樣繼承自Collection介面,
它與Collection介面中的方法基本一致,並沒有對Collection介面進行功能上的擴充,
只是比Collection介面更加嚴格了。與List介面不同的是,Set介面中元素無序,
並且都會以某種規則保證存入的元素不出現重複。Set集合有多個子類,
這裡我們介紹其中的
java.util.HashSet、
java.util.LinkedHashSet這兩個集合。
特點:都會以某種規則保證存入的元素不出現重複,Set介面中元素無序
①元素不出現重複
②元素無序( 指 存取 無序)
雜湊表:只要往雜湊表中儲存自定義物件,那麼該自定義物件 所屬的類 必須重寫hashCode&equals方法
⑴HashSet集合
底層是通過HashMap實現的 底層new HashMap物件 ,只用了 key 並沒有使用 value value指向統一地址 new Object()
API介紹:
java.util.HashSet是Set介面的一個實現類,它所儲存的元素是不可重複的,
並且元素都是無序的(即存取順序不一致)。java.util.HashSet底層的實現其實
是一個java.util.HashMap支援,HashSet是根據物件的雜湊值來確定元素在集合中的儲存位置,
因此具有良好的存取和查詢效能。保證元素唯一性的方式依賴於:hashCode與equals方法。
特點:
①元素不重複
②存取順序不一致
③良好的存取和查詢效能
④元素唯一性的方式依賴於:hashCode與equals方法
HashSet集合儲存資料的結構(雜湊表):
在JDK1.8之前,雜湊表底層採用陣列+連結串列實現,即使用連結串列處理衝突,
同一hash值的連結串列都儲存在一個連結串列裡。但是當位於一個桶中的元素較多,
即hash值相等的元素較多時,通過key值依次查詢的效率較低。
而JDK1.8中,雜湊表儲存採用陣列+連結串列+紅黑樹實現,
當連結串列長度超過閾值(8)時,將連結串列轉換為紅黑樹,這樣大大減少了查詢時間。
總而言之,JDK1.8引入紅黑樹大程度優化了HashMap的效能,
那麼對於我們來講保證HashSet集合元素的唯一,其實就是根據物件的
hashCode和equals方法來決定的。如果我們往集合中存放自定義的物件,
那麼保證其唯一,就必須複寫hashCode和equals方法建立屬於當前物件的比較方式。
總結:1.8之前是通過 雜湊表底層採用陣列+連結串列實現
1.8中是通過 雜湊表儲存採用陣列+連結串列+紅黑樹實現(連結串列長度超過閾值(8)時,將連結串列轉換為紅黑樹,這樣大大減少了查詢時間)
保證元素其唯一,必須重寫hashCode和equals方法建立屬於當前物件的比較方式
HashSet儲存自定義型別元素(重點):
給HashSet中存放自定義型別元素時,需要重寫物件中的hashCode和equals方法,
建立自己的比較方式,才能保證HashSet集合中的物件唯一
⑵LinkedHashSet
HashSet保證元素唯一,可是元素存放進去是沒有順序的,那麼我們要保證有序,怎麼辦呢
在HashSet下面有一個子類java.util.LinkedHashSet,它是 連結串列和雜湊表 組合的一個數據儲存結構。
API介紹:
java.util.Set介面和java.util.List介面一樣,同樣繼承自Collection介面,
它與Collection介面中的方法基本一致,並沒有對Collection介面進行功能上的擴充,
只是比Collection介面更加嚴格了。與List介面不同的是,Set介面中元素無序,
並且都會以某種規則保證存入的元素不出現重複。Set集合有多個子類,
這裡我們介紹其中的
java.util.HashSet、
java.util.LinkedHashSet這兩個集合。
特點:都會以某種規則保證存入的元素不出現重複,Set介面中元素無序
①元素不出現重複
②元素無序( 指 存取 無序)
雜湊表:只要往雜湊表中儲存自定義物件,那麼該自定義物件 所屬的類 必須重寫hashCode&equals方法
⑴HashSet集合
底層是通過HashMap實現的 底層new HashMap物件 ,只用了 key 並沒有使用 value value指向統一地址 new Object()
API介紹:
java.util.HashSet是Set介面的一個實現類,它所儲存的元素是不可重複的,
並且元素都是無序的(即存取順序不一致)。java.util.HashSet底層的實現其實
是一個java.util.HashMap支援,HashSet是根據物件的雜湊值來確定元素在集合中的儲存位置,
因此具有良好的存取和查詢效能。保證元素唯一性的方式依賴於:hashCode與equals方法。
特點:
①元素不重複
②存取順序不一致
③良好的存取和查詢效能
④元素唯一性的方式依賴於:hashCode與equals方法
HashSet集合儲存資料的結構(雜湊表):
在JDK1.8之前,雜湊表底層採用陣列+連結串列實現,即使用連結串列處理衝突,
同一hash值的連結串列都儲存在一個連結串列裡。但是當位於一個桶中的元素較多,
即hash值相等的元素較多時,通過key值依次查詢的效率較低。
而JDK1.8中,雜湊表儲存採用陣列+連結串列+紅黑樹實現,
當連結串列長度超過閾值(8)時,將連結串列轉換為紅黑樹,這樣大大減少了查詢時間。
總而言之,JDK1.8引入紅黑樹大程度優化了HashMap的效能,
那麼對於我們來講保證HashSet集合元素的唯一,其實就是根據物件的
hashCode和equals方法來決定的。如果我們往集合中存放自定義的物件,
那麼保證其唯一,就必須複寫hashCode和equals方法建立屬於當前物件的比較方式。
總結:1.8之前是通過 雜湊表底層採用陣列+連結串列實現
1.8中是通過 雜湊表儲存採用陣列+連結串列+紅黑樹實現(連結串列長度超過閾值(8)時,將連結串列轉換為紅黑樹,這樣大大減少了查詢時間)
保證元素其唯一,必須重寫hashCode和equals方法建立屬於當前物件的比較方式
HashSet儲存自定義型別元素(重點):
給HashSet中存放自定義型別元素時,需要重寫物件中的hashCode和equals方法,
建立自己的比較方式,才能保證HashSet集合中的物件唯一
⑵LinkedHashSet
HashSet保證元素唯一,可是元素存放進去是沒有順序的,那麼我們要保證有序,怎麼辦呢
在HashSet下面有一個子類java.util.LinkedHashSet,它是 連結串列和雜湊表 組合的一個數據儲存結構。