日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
HashSet集合,從入門到精通

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

創(chuàng)新互聯(lián)從2013年成立,是專業(yè)互聯(lián)網(wǎng)技術服務公司,擁有項目成都做網(wǎng)站、成都網(wǎng)站制作網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元平川做網(wǎng)站,已為上家服務,為平川各地企業(yè)和個人服務,聯(lián)系電話:028-86922220

在 JDK1.8 中,HashMap 是由 數(shù)組+鏈表+紅黑樹構成,相對于早期版本的 JDK HashMap 實現(xiàn),新增了紅黑樹作為底層數(shù)據(jù)結構,在數(shù)據(jù)量較大且哈希碰撞較多時,能夠極大的增加檢索的效率。了解 HashMap 的具體實現(xiàn)后,我們再來介紹由 HashMap 作為底層數(shù)據(jù)結構實現(xiàn)的一種數(shù)據(jù)結構——HashSet。(如果不了解 HashMap 的實現(xiàn)原理,建議先看看 HashMap,不然直接看 HashSet 是很難看懂的)。

1.HashSet 定義

HashSet 是一個由 HashMap 實現(xiàn)的集合。元素無序且不能重復。

 public class HashSet
extends AbstractSet
implements Set, Cloneable, java.io.Serializable

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

2.字段屬性

 //HashSet集合中的內(nèi)容是通過 HashMap 數(shù)據(jù)結構來存儲的
private transient HashMap map;
//向HashSet中添加數(shù)據(jù),數(shù)據(jù)在上面的 map 結構是作為 key 存在的,而value統(tǒng)一都是 PRESENT
private static final Object PRESENT = new Object();

第一個定義一個 HashMap,作為實現(xiàn) HashSet 的數(shù)據(jù)結構;第二個 PRESENT 對象,因為前面講過 HashMap 是作為鍵值對 key-value 進行存儲的,而 HashSet 不是鍵值對,那么選擇 HashMap 作為實現(xiàn),其原理就是存儲在 HashSet 中的數(shù)據(jù) 作為 Map 的 key,而 Map 的value 統(tǒng)一為 PRESENT(下面介紹具體實現(xiàn)時會了解)。

3.構造函數(shù)

①無參構造

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

直接 new 一個 HashMap 對象出來,采用無參的 HashMap 構造函數(shù),具有默認初始容量(16)和加載因子(0.75)。

②指定初始容量

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

③指定初始容量和加載因子

public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}

④構造包含指定集合中的元素


public HashSet(Collection c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}

集合容量很好理解,這里我介紹一下什么是加載因子。在 HashMap 中,能夠存儲元素的數(shù)量就是:總的容量*加載因子 ,新增一個元素時,如果HashMap集合中的元素大于前面公式計算的結果了,那么就必須要進行擴容操作,從時間和空間考慮,加載因子一般都選默認的0.75。

4.添加元素

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

通過 map.put() 方法來添加元素,在上一篇博客介紹該方法時,說明了該方法如果新插入的key不存在,則返回null,如果新插入的key存在,則返回原key對應的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.遍歷元素

HashSet set = new HashSet<>();
set.add(1);
set.add(2);
//增強for循環(huán)
for(Integer i : set){
System.out.println(i);
}
//普通for循環(huán)
Iterator iterator = set.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}

8.小結

好了,這就是JDK中java.util.HashSet 類的介紹。

我是指北君,操千曲而后曉聲,觀千劍而后識器。感謝各位人才的:點贊、收藏和評論,我們下期更精彩!


分享名稱:HashSet集合,從入門到精通
文章起源:http://www.5511xx.com/article/ccieosc.html