RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

JDK中java.util.HashSet 類(lèi)的介紹

科技綠洲 ? 來(lái)源:Java技術(shù)指北 ? 作者:Java技術(shù)指北 ? 2023-10-09 10:50 ? 次閱讀

在 JDK1.8 中,HashMap 是由 數(shù)組+鏈表+紅黑樹(shù)構(gòu)成,相對(duì)于早期版本的 JDK HashMap 實(shí)現(xiàn),新增了紅黑樹(shù)作為底層數(shù)據(jù)結(jié)構(gòu),在數(shù)據(jù)量較大且哈希碰撞較多時(shí),能夠極大的增加檢索的效率。了解 HashMap 的具體實(shí)現(xiàn)后,我們?cè)賮?lái)介紹由 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

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

①、無(wú)參構(gòu)造

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

直接 new 一個(gè) HashMap 對(duì)象出來(lái),采用無(wú)參的 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 中,能夠存儲(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());
}

8、小結(jié)

好了,這就是JDK中java.util.HashSet 類(lèi)的介紹。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 存儲(chǔ)
    +關(guān)注

    關(guān)注

    13

    文章

    4296

    瀏覽量

    85798
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2966

    瀏覽量

    104702
  • 數(shù)據(jù)結(jié)構(gòu)

    關(guān)注

    3

    文章

    573

    瀏覽量

    40123
  • JDK
    JDK
    +關(guān)注

    關(guān)注

    0

    文章

    81

    瀏覽量

    16592
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    java jdk安裝參考步驟

    1、把jdk-8u5-linux-x64.gz解壓,然后把解壓的文件夾放到/usr/lib/jvm/下,并重命名為jdk,這個(gè)目錄可以自定義。2、編輯~/.basrc文件,在文件的末尾追加下面的命令
    發(fā)表于 09-25 16:43

    樹(shù)莓派如何安裝Java JDK?

    。Oracle Java 具有其他一些商業(yè)功能,并且許可僅允許非商業(yè)用途。下面介紹如何在樹(shù)莓派的 Raspbian OS 上安裝Java(OpenJDK)?! ∵\(yùn)行以下命令安裝最新的 JDK
    發(fā)表于 02-02 16:37

    看看基于JDK自帶JVM工具的用法

    用到命令,下面圍繞一個(gè)微服務(wù)的啟動(dòng)和運(yùn)行,來(lái)看看基于JDK自帶JVM工具的用法;三、命令行工具1、jps命令jps :虛擬機(jī)進(jìn)程狀態(tài)工具,該命令在Java環(huán)境部署和服務(wù)啟動(dòng)查看時(shí)經(jīng)常用到,首先在本地
    發(fā)表于 11-16 15:30

    java jdk6.0官方下載

    java jdk6.0下載如何件: java jdk6.0安裝步驟: 第一步 JDK1.6的安裝步驟 第一步雙擊安裝文件
    發(fā)表于 10-17 11:47 ?155次下載
    <b class='flag-5'>java</b> <b class='flag-5'>jdk</b>6.0官方下載

    java基礎(chǔ)——java.util.ConcurrentModificationException

    本文檔內(nèi)容介紹java基礎(chǔ)java.util.ConcurrentModificationException,供參考
    發(fā)表于 03-13 11:31 ?2次下載

    JavaArrays類(lèi)是什么 Arrays常用方法

    了解Arrays類(lèi)的概念 **A****rrays** 位于java.util包下,Arrays是一個(gè)操作數(shù)組的工具類(lèi)。 Arrays常用方法 Arrays.fill:
    的頭像 發(fā)表于 02-17 15:11 ?1041次閱讀
    <b class='flag-5'>Java</b><b class='flag-5'>中</b>Arrays<b class='flag-5'>類(lèi)</b>是什么 Arrays常用方法

    Java時(shí)間類(lèi)轉(zhuǎn)換方案

    LocalDate 的過(guò)程,我們使用 Date 類(lèi)Java 8 新增的 toInstant() 方法進(jìn)行轉(zhuǎn)換。 當(dāng)我們轉(zhuǎn)換一個(gè) Instant 對(duì)象時(shí),需要使用 ZoneId
    的頭像 發(fā)表于 10-09 15:48 ?487次閱讀

    JDKjava.util.TreeMap 類(lèi)介紹

    本篇文章給大家介紹基于樹(shù)實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu)——TreeMap 1、TreeMap 定義 聽(tīng)名字就知道,TreeMap 是由Tree 和 Map 集合有關(guān)的,沒(méi)錯(cuò),TreeMap 是由紅黑樹(shù)實(shí)現(xiàn)的有序
    的頭像 發(fā)表于 10-10 11:45 ?557次閱讀
    <b class='flag-5'>JDK</b><b class='flag-5'>中</b><b class='flag-5'>java.util</b>.TreeMap <b class='flag-5'>類(lèi)</b>的<b class='flag-5'>介紹</b>

    JDKjava.util.ArrayList 類(lèi)介紹

    AbstractList E > implements List E >, RandomAccess , Cloneable , java.io.Serializable ①、實(shí)現(xiàn) RandomAccess 接口 這是
    的頭像 發(fā)表于 10-10 15:51 ?652次閱讀
    <b class='flag-5'>JDK</b><b class='flag-5'>中</b><b class='flag-5'>java.util</b>.ArrayList <b class='flag-5'>類(lèi)</b>的<b class='flag-5'>介紹</b>

    JDKjava.lang.Arrays 類(lèi)的源碼解析

    日常開(kāi)發(fā),我們會(huì)使用各種工具類(lèi),利用封裝好的輪子,能讓我們的開(kāi)發(fā)事半功倍。但是在JDK,有一個(gè)特別的工具類(lèi)——
    的頭像 發(fā)表于 10-11 15:31 ?612次閱讀
    <b class='flag-5'>JDK</b><b class='flag-5'>中</b><b class='flag-5'>java</b>.lang.Arrays <b class='flag-5'>類(lèi)</b>的源碼解析

    JDKjava.lang.String 類(lèi)的源碼解析

    1、String 類(lèi)的定義 public final class String implements java.io.Serializable, Comparable, CharSequence
    的頭像 發(fā)表于 10-13 10:51 ?490次閱讀
    <b class='flag-5'>JDK</b><b class='flag-5'>中</b><b class='flag-5'>java</b>.lang.String <b class='flag-5'>類(lèi)</b>的源碼解析

    javautil包下有哪些類(lèi)

    Javautil包下,包含了許多類(lèi),用于提供各種常見(jiàn)的實(shí)用工具和數(shù)據(jù)結(jié)構(gòu)。以下是一些常見(jiàn)的類(lèi): ArrayList:動(dòng)態(tài)數(shù)組,可以根據(jù)需要自動(dòng)調(diào)整大小。 LinkedList:雙向
    的頭像 發(fā)表于 11-22 15:04 ?1120次閱讀

    weblogic修改jdk路徑

    )路徑的情況。本文將詳細(xì)介紹如何在WebLogic修改JDK路徑。 一、背景介紹 Java Development Kit(
    的頭像 發(fā)表于 12-05 14:46 ?1299次閱讀

    OpenHarmony語(yǔ)言基礎(chǔ)類(lèi)庫(kù)【@ohos.util.HashSet (非線(xiàn)性容器HashSet)】

    HashSet基于[HashMap]實(shí)現(xiàn)。在HashSet,只對(duì)value對(duì)象進(jìn)行處理。
    的頭像 發(fā)表于 04-26 15:13 ?290次閱讀
    OpenHarmony語(yǔ)言基礎(chǔ)<b class='flag-5'>類(lèi)</b>庫(kù)【@ohos.<b class='flag-5'>util.HashSet</b> (非線(xiàn)性容器<b class='flag-5'>HashSet</b>)】

    Java集合API的改進(jìn)介紹

    簡(jiǎn)介 本文我們將探討不同 jdk 版本各類(lèi)的起源,以及新引入的類(lèi)和接口背后的目的。我們將分析之前版本存在的問(wèn)題,以及為何需要引入新的類(lèi)或接口。此外,我們還將
    的頭像 發(fā)表于 11-22 11:12 ?175次閱讀
    <b class='flag-5'>Java</b>集合API的改進(jìn)<b class='flag-5'>介紹</b>
    RM新时代网站-首页