新聞中心
本篇文章指北君給大家介紹一個集合——HashSet,這也是現(xiàn)在面試必問的一個集合,通常用于存放不能重復(fù)的數(shù)據(jù),可以說這個集合是HashMap 的兒子,為什么這樣說呢?看完你就明白了

創(chuàng)新互聯(lián)從2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都做網(wǎng)站、成都網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元平川做網(wǎng)站,已為上家服務(wù),為平川各地企業(yè)和個人服務(wù),聯(lián)系電話:028-86922220
在 JDK1.8 中,HashMap 是由 數(shù)組+鏈表+紅黑樹構(gòu)成,相對于早期版本的 JDK HashMap 實(shí)現(xiàn),新增了紅黑樹作為底層數(shù)據(jù)結(jié)構(gòu),在數(shù)據(jù)量較大且哈希碰撞較多時,能夠極大的增加檢索的效率。了解 HashMap 的具體實(shí)現(xiàn)后,我們再來介紹由 HashMap 作為底層數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的一種數(shù)據(jù)結(jié)構(gòu)——HashSet。(如果不了解 HashMap 的實(shí)現(xiàn)原理,建議先看看 HashMap,不然直接看 HashSet 是很難看懂的)。
1.HashSet 定義
HashSet 是一個由 HashMap 實(shí)現(xiàn)的集合。元素?zé)o序且不能重復(fù)。
public class HashSet
extends AbstractSet
implements Set, Cloneable, java.io.Serializable
和前面介紹的大多數(shù)集合一樣,HashSet 也實(shí)現(xiàn)了 Cloneable 接口和 Serializable 接口,分別用來支持克隆以及支持序列化。還實(shí)現(xiàn)了 Set 接口,該接口定義了 Set 集合類型的一套規(guī)范。
2.字段屬性
//HashSet集合中的內(nèi)容是通過 HashMap 數(shù)據(jù)結(jié)構(gòu)來存儲的
private transient HashMapmap;
//向HashSet中添加數(shù)據(jù),數(shù)據(jù)在上面的 map 結(jié)構(gòu)是作為 key 存在的,而value統(tǒng)一都是 PRESENT
private static final Object PRESENT = new Object();
第一個定義一個 HashMap,作為實(shí)現(xiàn) HashSet 的數(shù)據(jù)結(jié)構(gòu);第二個 PRESENT 對象,因?yàn)榍懊嬷v過 HashMap 是作為鍵值對 key-value 進(jìn)行存儲的,而 HashSet 不是鍵值對,那么選擇 HashMap 作為實(shí)現(xiàn),其原理就是存儲在 HashSet 中的數(shù)據(jù) 作為 Map 的 key,而 Map 的value 統(tǒng)一為 PRESENT(下面介紹具體實(shí)現(xiàn)時會了解)。
3.構(gòu)造函數(shù)
①無參構(gòu)造
public HashSet() {
map = new HashMap<>();
}
直接 new 一個 HashMap 對象出來,采用無參的 HashMap 構(gòu)造函數(shù),具有默認(rèn)初始容量(16)和加載因子(0.75)。
②指定初始容量
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
③指定初始容量和加載因子
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
④構(gòu)造包含指定集合中的元素
public HashSet(Collection extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
集合容量很好理解,這里我介紹一下什么是加載因子。在 HashMap 中,能夠存儲元素的數(shù)量就是:總的容量*加載因子 ,新增一個元素時,如果HashMap集合中的元素大于前面公式計(jì)算的結(jié)果了,那么就必須要進(jìn)行擴(kuò)容操作,從時間和空間考慮,加載因子一般都選默認(rèn)的0.75。
4.添加元素
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
通過 map.put() 方法來添加元素,在上一篇博客介紹該方法時,說明了該方法如果新插入的key不存在,則返回null,如果新插入的key存在,則返回原key對應(yīng)的value值(注意新插入的value會覆蓋原value值)。
也就是說 HashSet 的 add(E e) 方法,會將 e 作為 key,PRESENT 作為 value 插入到 map 集合中,如果 e 不存在,則插入成功返回 true;如果存在,則返回false。
5.刪除元素
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
調(diào)用 HashMap 的remove(Object o) 方法,該方法會首先查找 map 集合中是否存在 o ,如果存在則刪除,并返回該值,如果不存在則返回 null。
也就是說 HashSet 的 remove(Object o) 方法,刪除成功返回 true,刪除的元素不存在會返回 false。
6.查找元素
public boolean contains(Object o) {
return map.containsKey(o);
}
調(diào)用 HashMap 的 containsKey(Object o) 方法,找到了返回 true,找不到返回 false。
7.遍歷元素
HashSetset = new HashSet<>();
set.add(1);
set.add(2);
//增強(qiáng)for循環(huán)
for(Integer i : set){
System.out.println(i);
}
//普通for循環(huán)
Iteratoriterator = set.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
8.小結(jié)
好了,這就是JDK中java.util.HashSet 類的介紹。
我是指北君,操千曲而后曉聲,觀千劍而后識器。感謝各位人才的:點(diǎn)贊、收藏和評論,我們下期更精彩!
網(wǎng)站題目:HashSet集合,從入門到精通
鏈接分享:http://m.fisionsoft.com.cn/article/ccieosc.html


咨詢
建站咨詢
