黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國(guó)咨詢/投訴熱線:400-8080-105
動(dòng)力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁(yè) 學(xué)習(xí)攻略 Java學(xué)習(xí) Java編程技術(shù)分享,hashset方法原理

Java編程技術(shù)分享,hashset方法原理

更新時(shí)間:2020-05-26 16:20:17 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽2238次

Java編程技術(shù)分享,hashset方法原理,HashMap作為底層數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的一種數(shù)據(jù)結(jié)構(gòu)——HashSet。(如果不了解HashMap的實(shí)現(xiàn)原理,建議先看看HashMap,不然直接看HashSet是很難看懂的)。

1.HashSet定義

HashSet是一個(gè)由HashMap實(shí)現(xiàn)的集合。元素?zé)o序且不能重復(fù)。

?public?class?HashSet<E>
?????extends?AbstractSet<E>
?????implements?Set<E>,?Cloneable,?java.io.Serializable

Java編程技術(shù)分享,hashset方法原理

和前面介紹的大多數(shù)集合一樣,HashSet也實(shí)現(xiàn)了Cloneable接口和Serializable接口,分別用來(lái)支持克隆以及支持序列化。還實(shí)現(xiàn)了Set接口,該接口定義了Set集合類型的一套規(guī)范。

2.字段屬性

//HashSet集合中的內(nèi)容是通過(guò)?HashMap?數(shù)據(jù)結(jié)構(gòu)來(lái)存儲(chǔ)的
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();

第一個(gè)定義一個(gè)HashMap,作為實(shí)現(xiàn)HashSet的數(shù)據(jù)結(jié)構(gòu);第二個(gè)PRESENT對(duì)象,因?yàn)榍懊嬷v過(guò)HashMap是作為鍵值對(duì)key-value進(jìn)行存儲(chǔ)的,而HashSet不是鍵值對(duì),那么選擇HashMap作為實(shí)現(xiàn),其原理就是存儲(chǔ)在HashSet中的數(shù)據(jù)作為Map的key,而Map的value統(tǒng)一為PRESENT(下面介紹具體實(shí)現(xiàn)時(shí)會(huì)了解)。

3.構(gòu)造函數(shù)

1)無(wú)參構(gòu)造

public?HashSet()?{
???map?=?new?HashMap<>();
?}

直接new一個(gè)HashMap對(duì)象出來(lái),采用無(wú)參的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中,能夠存儲(chǔ)元素的數(shù)量就是:總的容量*加載因子,新增一個(gè)元素時(shí),如果HashMap集合中的元素大于前面公式計(jì)算的結(jié)果了,那么就必須要進(jìn)行擴(kuò)容操作,從時(shí)間和空間考慮,加載因子一般都選默認(rèn)的0.75。

4.添加元素

public?boolean?add(E?e)?{
???return?map.put(e,?PRESENT)==null;
??}

通過(guò)map.put()方法來(lái)添加元素,在上一篇博客介紹該方法時(shí),說(shuō)明了該方法如果新插入的key不存在,則返回null,如果新插入的key存在,則返回原key對(duì)應(yīng)的value值(注意新插入的value會(huì)覆蓋原value值)。

也就是說(shuō)HashSet的add(E e)方法,會(huì)將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)方法,該方法會(huì)首先查找map集合中是否存在o,如果存在則刪除,并返回該值,如果不存在則返回null。

也就是說(shuō)HashSet的remove(Object o)方法,刪除成功返回true,刪除的元素不存在會(huì)返回false。

6.查找元素

public?boolean?contains(Object?o)?{
return?map.containsKey(o);
?}

調(diào)用 HashMap 的 containsKey(Object o) 方法,找到了返回 true,找不到返回 false。

7.遍歷元素

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());
}

以上就是動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“Java編程技術(shù)分享,hashset方法原理”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問(wèn),請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。

提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)

  • 全國(guó)校區(qū) 2025-05-15 搶座中
  • 全國(guó)校區(qū) 2025-06-05 搶座中
  • 全國(guó)校區(qū) 2025-06-26 搶座中
免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 成人禁18视频在线观看 | 亚洲高清日韩精品第一区 | 成人综合在线视频免费观看 | 久久人人爽人人爽人人 | 右手影院亚洲欧美 | 欧美一级日韩一级 | 波多野结衣四虎精品影库 | 欧美一区二区视频在线观看 | 男女男在线精品网站免费观看 | 日本全黄三级在线观看 | 欧美亚洲另类一区中文字幕 | 亚洲图片国产日韩欧美 | 超级碰97| 丝袜足控免费网站xx网站 | 亚洲人成网站色7799在线观看 | 国产成人小视频在线观看 | 亚洲天堂v | 亚洲精品国产成人 | 欧美丝袜自拍 | 欧美一级久久久久久久久大 | 妞干网免费在线 | 精品欧美一区二区在线看片 | 成人影片在线免费观看 | 亚洲aⅴ在线 | 天天澡夜夜澡狠狠澡 | 亚欧中文字幕 | 涩涩亚洲 | 亚洲日本中文字幕在线2022 | 亚洲无线码一区二区三区在线观看 | 最近中文字幕免费完整国语 | 两性色午夜视频自由成熟的性 | 老黄网站在线观看免费 | 亚洲第一激情 | 黄色网址在线看 | 操人网站 | 国产精品日日摸夜夜添夜夜添1 | 国产精品自在线拍国产 | 青青草成人网 | 国产成人精品aaaa视频一区 | 国产成人v视频在线观看 | 日韩国产三级 |