更新時間:2020-05-26 16:20:17 來源:動力節(jié)點 瀏覽2282次
Java編程技術(shù)分享,hashset方法原理,HashMap作為底層數(shù)據(jù)結(jié)構(gòu)實現(xiàn)的一種數(shù)據(jù)結(jié)構(gòu)——HashSet。(如果不了解HashMap的實現(xiàn)原理,建議先看看HashMap,不然直接看HashSet是很難看懂的)。
HashSet是一個由HashMap實現(xiàn)的集合。元素?zé)o序且不能重復(fù)。
?public?class?HashSet<E>
?????extends?AbstractSet<E>
?????implements?Set<E>,?Cloneable,?java.io.Serializable
和前面介紹的大多數(shù)集合一樣,HashSet也實現(xiàn)了Cloneable接口和Serializable接口,分別用來支持克隆以及支持序列化。還實現(xiàn)了Set接口,該接口定義了Set集合類型的一套規(guī)范。
//HashSet集合中的內(nèi)容是通過?HashMap?數(shù)據(jù)結(jié)構(gòu)來存儲的
private?transient?HashMap<E,Object>?map;
//向HashSet中添加數(shù)據(jù),數(shù)據(jù)在上面的?map?結(jié)構(gòu)是作為?key?存在的,而value統(tǒng)一都是?PRESENT
private?static?final?Object?PRESENT?=?new?Object();
第一個定義一個HashMap,作為實現(xiàn)HashSet的數(shù)據(jù)結(jié)構(gòu);第二個PRESENT對象,因為前面講過HashMap是作為鍵值對key-value進(jìn)行存儲的,而HashSet不是鍵值對,那么選擇HashMap作為實現(xiàn),其原理就是存儲在HashSet中的數(shù)據(jù)作為Map的key,而Map的value統(tǒng)一為PRESENT(下面介紹具體實現(xiàn)時會了解)。
1)無參構(gòu)造
public?HashSet()?{
???map?=?new?HashMap<>();
?}
直接new一個HashMap對象出來,采用無參的HashMap構(gòu)造函數(shù),具有默認(rèn)初始容量(16)和加載因子(0.75)。
2)指定初始容量
public?HashSet(int?initialCapacity)?{
????map?=?new?HashMap<>(initialCapacity);
?????????}
3)指定初始容量和加載因子
public?HashSet(int?initialCapacity,?float?loadFactor)?{
????map?=?new?HashMap<>(initialCapacity,?loadFactor);
??}
4)構(gòu)造包含指定集合中的元素
public?HashSet(Collection<??extends?E>?c)?{
???map?=?new?HashMap<>(Math.max((int)?(c.size()/.75f)?+?1,?16));
???addAll(c);
?}
集合容量很好理解,這里我介紹一下什么是加載因子。在HashMap中,能夠存儲元素的數(shù)量就是:總的容量*加載因子,新增一個元素時,如果HashMap集合中的元素大于前面公式計算的結(jié)果了,那么就必須要進(jìn)行擴(kuò)容操作,從時間和空間考慮,加載因子一般都選默認(rèn)的0.75。
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。
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。
public?boolean?contains(Object?o)?{
return?map.containsKey(o);
?}
調(diào)用 HashMap 的 containsKey(Object o) 方法,找到了返回 true,找不到返回 false。
HashSet<Integer>?set?=?new?HashSet<>();
set.add(1);
set.add(2);
//增強(qiáng)for循環(huán)
for(Integer?i?:?set){
??System.out.println(i);
}
//普通for循環(huán)
Iterator<Integer>?iterator?=?set.iterator();
while?(iterator.hasNext()){
????System.out.println(iterator.next());
}
以上就是動力節(jié)點java培訓(xùn)機(jī)構(gòu)的小編針對“Java編程技術(shù)分享,hashset方法原理”的內(nèi)容進(jìn)行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務(wù)。
相關(guān)閱讀
初級 202925
初級 203221
初級 202629
初級 203743