Java中的Set接口實(shí)現(xiàn)類(lèi)HashSet和LinkedHashSet詳解
Set接口
java.util.Set接口和java.util.List接口一樣,同樣繼承自Collection接口,它與Collection接口中的方法基本一致,并沒(méi)有對(duì)Collection接口進(jìn)行功能上的擴(kuò)充,只是比Collection接口更加嚴(yán)格了。
與List接口不同的是,Set接口中元素?zé)o序,并且都會(huì)以某種規(guī)則保證存入的元素不出現(xiàn)重復(fù)。
Set集合有多個(gè)子類(lèi),這里我們介紹其中的java.util.HashSet、java.util.LinkedHashSet這兩個(gè)集合。
HashSet集合介紹
java.util.HashSet是Set接口的一個(gè)實(shí)現(xiàn)類(lèi),它所存儲(chǔ)的元素是不可重復(fù)的,并且元素都是無(wú)序的(即存取順序不一致)。java.util.HashSet底層的實(shí)現(xiàn)其實(shí)是一個(gè)java.util.HashMap支持.
HashSet是根據(jù)對(duì)象的哈希值來(lái)確定元素在集合中的存儲(chǔ)位置,因此具有良好的存取和查找性能。保證元素唯一性的方式依賴(lài)于:hashCode與equals方法。
public class test {
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();
set.add("cba");
set.add("cba");
set.add("cbc");
set.add("cbd");
System.out.println(set);
}
}
代碼輸出:

說(shuō)明HashSet實(shí)現(xiàn)類(lèi)是一個(gè)無(wú)序并且不重復(fù)的類(lèi)。
HashSet集合存儲(chǔ)數(shù)據(jù)的結(jié)構(gòu)(哈希表)
什么是哈希表呢?
在JDK1.8之前,哈希表底層采用數(shù)組+鏈表實(shí)現(xiàn),即使用鏈表處理沖突,同一hash值的鏈表都存儲(chǔ)在一個(gè)鏈表里。但是當(dāng)位于一個(gè)桶中的元素較多,即hash值相等的元素較多時(shí),通過(guò)key值依次查找的效率較低。而JDK1.8中,哈希表存儲(chǔ)采用數(shù)組+鏈表+紅黑樹(shù)實(shí)現(xiàn),當(dāng)鏈表長(zhǎng)度超過(guò)閾值(8)時(shí),將鏈表轉(zhuǎn)換為紅黑樹(shù),這樣大大減少了查找時(shí)間。
簡(jiǎn)單的來(lái)說(shuō),哈希表是由數(shù)組+鏈表+紅黑樹(shù)(JDK1.8增加了紅黑樹(shù)部分)實(shí)現(xiàn)的,如下圖所示。

看到這張圖就有人要問(wèn)了,這個(gè)是怎么存儲(chǔ)的呢?
為了方便大家的理解我們結(jié)合一個(gè)存儲(chǔ)流程圖來(lái)說(shuō)明一下:

總而言之,JDK1.8引入紅黑樹(shù)大程度優(yōu)化了HashMap的性能,那么對(duì)于我們來(lái)講保證HashSet集合元素的唯一,其實(shí)就是根據(jù)對(duì)象的hashCode和equals方法來(lái)決定的。
如果我們往集合中存放自定義的對(duì)象,那么保證其唯一,就必須復(fù)寫(xiě)hashCode和equals方法建立屬于當(dāng)前對(duì)象的比較方式。
LinkedHashSet
我們知道HashSet保證元素唯一,可是元素存放進(jìn)去是沒(méi)有順序的,那么我們要保證有序,怎么辦呢?
在HashSet下面有一個(gè)子類(lèi)java.util.LinkedHashSet,它是鏈表和哈希表組合的一個(gè)數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)。
public class LinkedHashSetDemo {
public static void main(String[] args) {
Set<String> set = new LinkedHashSet<String>();
set.add("bbb");
set.add("aaa");
set.add("abc");
set.add("bbc");
Iterator<String> it = set.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
結(jié)果:
bbb
aaa
abc
bbc
LinkedHashSet特點(diǎn)就是里面的元素有序,不重復(fù)。
到此這篇關(guān)于Java中的Set接口實(shí)現(xiàn)類(lèi)HashSet和LinkedHashSet詳解的文章就介紹到這了,更多相關(guān)Set接口實(shí)現(xiàn)類(lèi)詳解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java LinkedHashSet集合的底層原理和TreeSet集合
- Java中HashMap和HashSet的高效使用技巧分享
- Java集合ArrayList、LinkedList、HashMap、HashSet最大容量
- Java中HashSet、LinkedHashSet和TreeSet區(qū)別詳解
- java的==運(yùn)算符和equals操作詳解
- Java中==和equals()的區(qū)別總結(jié)
- java兩個(gè)integer數(shù)據(jù)判斷相等用==還是equals
- 詳解Java中==和equals()的區(qū)別
- 淺談java字符串比較到底應(yīng)該用==還是equals
- java中的HashSet與 == 和 equals的區(qū)別示例解析
相關(guān)文章
Java 客戶(hù)端操作 FastDFS 實(shí)現(xiàn)文件上傳下載替換刪除功能
這篇文章主要介紹了Java 客戶(hù)端操作 FastDFS 實(shí)現(xiàn)文件上傳下載替換刪除功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
springboot -sse -flux 服務(wù)器推送消息的方法
這篇文章主要介紹了springboot -sse -flux 服務(wù)器推送消息的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-11-11
Java網(wǎng)絡(luò)通信中ServerSocket的設(shè)計(jì)優(yōu)化方案
今天小編就為大家分享一篇關(guān)于Java網(wǎng)絡(luò)通信中ServerSocket的設(shè)計(jì)優(yōu)化方案,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-04-04
Maven項(xiàng)目無(wú)法加載jdbc.properties的問(wèn)題解決
本文主要介紹了Maven項(xiàng)目無(wú)法加載jdbc.properties的問(wèn)題解決,文章首先分析了問(wèn)題的原因,然后提供了解決方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08
如何解決java.lang.ClassNotFoundException: com.mysql.jdbc.Dr
這篇文章主要介紹了如何解決java.lang.ClassNotFoundException: com.mysql.jdbc.Driver問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
SpringBoot配置GlobalExceptionHandler全局異常處理器案例
這篇文章主要介紹了SpringBoot配置GlobalExceptionHandler全局異常處理器案例,通過(guò)簡(jiǎn)要的文章說(shuō)明如何去進(jìn)行配置以及使用,需要的朋友可以參考下2021-06-06
SQLSyntaxErrorException-ExecutorException報(bào)錯(cuò)解決分析
這篇文章主要為大家介紹了SQLSyntaxErrorException-ExecutorException報(bào)錯(cuò)解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08

