成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

HashSet 集合,從入門到精通

開發 前端
在 JDK1.8 中,HashMap 是由數組+鏈表+紅黑樹構成,相對于早期版本的 JDK HashMap 實現,新增了紅黑樹作為底層數據結構,在數據量較大且哈希碰撞較多時,能夠極大的增加檢索的效率。

哈嘍,大家好,我是指北君。

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

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

1.HashSet 定義

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

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

圖片

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

2.字段屬性

 //HashSet集合中的內容是通過 HashMap 數據結構來存儲的
private transient HashMap<E,Object> map;
//向HashSet中添加數據,數據在上面的 map 結構是作為 key 存在的,而value統一都是 PRESENT
private static final Object PRESENT = new Object();

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

3.構造函數

①無參構造

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

直接 new 一個 HashMap 對象出來,采用無參的 HashMap 構造函數,具有默認初始容量(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<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}

集合容量很好理解,這里我介紹一下什么是加載因子。在 HashMap 中,能夠存儲元素的數量就是:總的容量*加載因子 ,新增一個元素時,如果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;
}

調用 HashMap 的remove(Object o) 方法,該方法會首先查找 map 集合中是否存在 o ,如果存在則刪除,并返回該值,如果不存在則返回 null。

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

6.查找元素

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

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

7.遍歷元素

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

8.小結

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

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

責任編輯:武曉燕 來源: Java技術指北
相關推薦

2010-02-06 15:31:18

ibmdwAndroid

2009-07-22 14:55:16

ibmdwAndroid

2016-12-08 22:39:40

Android

2017-05-09 08:48:44

機器學習

2012-02-29 00:49:06

Linux學習

2025-02-24 10:07:10

2024-02-26 08:52:20

Python傳遞函數參數參數傳遞類型

2010-11-08 10:20:18

2022-09-02 15:11:18

開發工具

2023-10-13 08:23:05

2009-07-03 18:49:00

網吧綜合布線

2009-03-19 13:36:53

SSH安全通道遠程

2011-10-26 20:47:36

ssh 安全

2024-06-07 08:51:50

OpenPyXLPythonExcel文件

2025-03-21 14:31:14

NumPyPython數組

2017-01-09 09:34:03

Docker容器傳統虛擬機

2023-05-09 08:34:51

PythonWith語句

2024-01-11 09:35:12

單元測試Python編程軟件開發

2011-06-07 10:33:11

Android Activity

2010-09-25 11:51:39

無線路由器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产在线观看免费 | 综合自拍 | 精品久久久久久久久久久院品网 | 中文字幕免费在线 | 午夜国产精品视频 | 日韩欧美亚洲 | 久久精品国产久精国产 | caoporon| 久久国产精品免费一区二区三区 | 81精品国产乱码久久久久久 | 午夜影视网 | 亚洲一区精品视频 | 国内精品久久精品 | 亚洲成人免费在线 | 国色天香成人网 | 在线午夜 | 亚洲精品乱码久久久久久按摩观 | 99在线资源| 一区二区国产精品 | 资源首页二三区 | 狠狠色网 | 国产精品久久久久久久久久久新郎 | 久久成人综合 | 欧美日韩免费在线 | 久久69精品久久久久久久电影好 | 日韩免费在线视频 | 欧美精品二区三区 | 亚洲成人精品久久 | 成人av鲁丝片一区二区小说 | 国产一区二区日韩 | 国产传媒| av网站观看 | 亚洲欧美视频一区 | a视频在线观看 | 欧美久久久久 | 国产精品久久久久久二区 | 久久精品国产一区老色匹 | 国产免费又黄又爽又刺激蜜月al | 亚洲在线日韩 | 91在线第一页 | 亚洲精品综合一区二区 |