精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

考考基礎部分,談談Java集合中HashSet的原理及常用方法

開發 后端
本文主要介紹了HashSet的原理以及主要方法,同時簡單介紹了LinkedHashSet和TreeSet,一起來看看吧。

 目錄

  •  HashSet概述
  •  HashSet構造
  •  add方法
  •  remove方法
  •  遍歷
  •  合計合計
    •  先看一下LinkedHashSet
    •  在看一下TreeSet
  • 總結

一. HashSet概述

HashSet是Java集合Set的一個實現類,Set是一個接口,其實現類除HashSet之外,還有TreeSet,并繼承了Collection,HashSet集合很常用,同時也是程序員面試時經常會被問到的知識點,下面是結構圖

 

  1. public class HashSet<E>  
  2.     extends AbstractSet<E>  
  3.     implements Set<E>, Cloneable, java.io.Serializable  
  4. {} 

二. HashSet構造

HashSet有幾個重載的構造方法,我們來看一下

  1. private transient HashMap<E,Object> map;  
  2. //默認構造器  
  3. public HashSet() {  
  4.     map = new HashMap<>();  
  5.  
  6. //將傳入的集合添加到HashSet的構造器  
  7. public HashSet(Collection<? extends E> c) {  
  8.     map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));  
  9.     addAll(c);  
  10.  
  11. //明確初始容量和裝載因子的構造器  
  12. public HashSet(int initialCapacity, float loadFactor) {  
  13.     map = new HashMap<>(initialCapacity, loadFactor);  
  14.  
  15. //僅明確初始容量的構造器(裝載因子默認0.75)  
  16. public HashSet(int initialCapacity) {  
  17.     map = new HashMap<>(initialCapacity);  

通過上面的源碼,我們發現了HashSet就TM是一個皮包公司,它就對外接活兒,活兒接到了就直接扔給HashMap處理了。因為底層是通過HashMap實現的,這里簡單提一下:

HashMap的數據存儲是通過數組+鏈表/紅黑樹實現的,存儲大概流程是通過hash函數計算在數組中存儲的位置,如果該位置已經有值了,判斷key是否相同,相同則覆蓋,不相同則放到元素對應的鏈表中,如果鏈表長度大于8,就轉化為紅黑樹,如果容量不夠,則需擴容(注:這只是大致流程)。往期:一百期面試題匯總

三. add方法

HashSet的add方法時通過HashMap的put方法實現的,不過HashMap是key-value鍵值對,而HashSet是集合,那么是怎么存儲的呢,我們看一下源碼 

  1. private static final Object PRESENT = new Object();  
  2. public boolean add(E e) {  
  3.     return map.put(e, PRESENT)==null;  

看源碼我們知道,HashSet添加的元素是存放在HashMap的key位置上,而value取了默認常量PRESENT,是一個空對象,至于map的put方法,大家可以看

https://www.cnblogs.com/LiaHon/p/11149644.html

四. remove方法

HashSet的remove方法通過HashMap的remove方法來實現 

  1. //HashSet的remove方法  
  2. public boolean remove(Object o) {  
  3.     return map.remove(o)==PRESENT;  
  4.  
  5. //map的remove方法  
  6. public V remove(Object key) {  
  7.     Node<K,V> e;  
  8.     //通過hash(key)找到元素在數組中的位置,再調用removeNode方法刪除  
  9.     return (e = removeNode(hash(key), key, null, false, true)) == null ? null : e.value;  
  10.  
  11. /**  
  12.  *   
  13.  */  
  14. final Node<K,V> removeNode(int hash, Object key, Object value,  
  15.                            boolean matchValue, boolean movable) {  
  16.     Node<K,V>[] tab; Node<K,V> p; int n, index;  
  17.     //步驟1.需要先找到key所對應Node的準確位置,首先通過(n - 1) & hash找到數組對應位置上的第一個node  
  18.     if ((tab = table) != null && (n = tab.length) > 0 &&  
  19.         (p = tab[index = (n - 1) & hash]) != null) {  
  20.         Node<K,V> node = null, e; K k; V v;  
  21.         //1.1 如果這個node剛好key值相同,運氣好,找到了  
  22.         if (p.hash == hash &&  
  23.             ((k = p.key) == key || (key != null && key.equals(k))))  
  24.             node = p 
  25.         /**  
  26.          * 1.2 運氣不好,在數組中找到的Node雖然hash相同了,但key值不同,很明顯不對, 我們需要遍歷繼續  
  27.          *     往下找;  
  28.          */  
  29.         else if ((e = p.next) != null) {  
  30.             //1.2.1 如果是TreeNode類型,說明HashMap當前是通過數組+紅黑樹來實現存儲的,遍歷紅黑樹找到對應node  
  31.             if (p instanceof TreeNode)  
  32.                 node = ((TreeNode<K,V>)p).getTreeNode(hash, key);  
  33.             else {  
  34.                 //1.2.2 如果是鏈表,遍歷鏈表找到對應node  
  35.                 do {  
  36.                     if (e.hash == hash &&  
  37.                         ((k = e.key) == key ||  
  38.                          (key != null && key.equals(k)))) {  
  39.                         node = e;  
  40.                         break;  
  41.                     }  
  42.                     p = e 
  43.                 } while ((ee = e.next) != null);  
  44.             }  
  45.         }  
  46.         //通過前面的步驟1找到了對應的Node,現在我們就需要刪除它了  
  47.         if (node != null && (!matchValue || (v = node.value) == value ||  
  48.                              (value != null && value.equals(v)))) {  
  49.             /**  
  50.              * 如果是TreeNode類型,刪除方法是通過紅黑樹節點刪除實現的,具體可以參考【TreeMap原理實現  
  51.              * 及常用方法】  
  52.              */  
  53.             if (node instanceof TreeNode)  
  54.                 ((TreeNode<K,V>)node).removeTreeNode(this, tab, movable);  
  55.             /**   
  56.              * 如果是鏈表的情況,當找到的節點就是數組hash位置的第一個元素,那么該元素刪除后,直接將數組  
  57.              * 第一個位置的引用指向鏈表的下一個即可  
  58.              */  
  59.             else if (node == p)  
  60.                 tab[index] = node.next;  
  61.             /**  
  62.              * 如果找到的本來就是鏈表上的節點,也簡單,將待刪除節點的上一個節點的next指向待刪除節點的  
  63.              * next,隔離開待刪除節點即可  
  64.              */  
  65.             else  
  66.                 p.next = node.next;  
  67.             ++modCount;  
  68.             --size;  
  69.             //刪除后可能存在存儲結構的調整,可參考【LinkedHashMap如何保證順序性】中remove方法  
  70.             afterNodeRemoval(node);  
  71.             return node;  
  72.         }  
  73.     }  
  74.     return null;  

removeTreeNode方法具體實現可參考

【144期】考考基礎部分,你能說出 TreeMap 原理實現及常用方法嗎?

afterNodeRemoval方法具體實現可參考

https://www.cnblogs.com/LiaHon/p/11180869.html

五. 遍歷

HashSet作為集合,有多種遍歷方法,如普通for循環,增強for循環,迭代器,我們通過迭代器遍歷來看一下 

  1. public static void main(String[] args) {  
  2.     HashSet<String> setString = new HashSet<> ();  
  3.     setString.add("星期一");  
  4.     setString.add("星期二");  
  5.     setString.add("星期三");  
  6.     setString.add("星期四");  
  7.     setString.add("星期五");  
  8.     Iterator it = setString.iterator();  
  9.     while (it.hasNext()) {  
  10.         System.out.println(it.next());  
  11.     }  

打印出來的結果如何呢? 

  1. 星期二  
  2. 星期三  
  3. 星期四  
  4. 星期五  
  5. 星期一 

意料之中吧,HashSet是通過HashMap來實現的,HashMap通過hash(key)來確定存儲的位置,是不具備存儲順序性的,因此HashSet遍歷出的元素也并非按照插入的順序。

六. 合計合計

按照我前面的規劃,應該每一塊主要的內容都單獨寫一下,如集合ArrayList,LinkedList,HashMap,TreeMap等。

不過我在寫這篇關于HashSet的文章時,發現有前面對HashMap的講解后,確實簡單,HashSet就是一個皮包公司,在HashMap外面加了一個殼,那么LinkedHashSet是否就是在LinkedHashMap外面加了一個殼呢,而TreeSet是否是在TreeMap外面加了一個殼?我們來驗證一下

先看一下LinkedHashSet

最開始的結構圖已經提到了LinkedHashSet是HashSet的子類,我們來看源碼 

  1. public class LinkedHashSet<E>  
  2.     extends HashSet<E>  
  3.     implements Set<E>, Cloneable, java.io.Serializable   
  4.  
  5.    public LinkedHashSet(int initialCapacity, float loadFactor) {  
  6.         super(initialCapacity, loadFactor, true);  
  7.     } 
  8.     public LinkedHashSet(int initialCapacity) {  
  9.         super(initialCapacity, .75f, true);  
  10.     }  
  11.     public LinkedHashSet() {  
  12.         super(16, .75f, true);  
  13.     }  
  14.     public LinkedHashSet(Collection<? extends E> c) {  
  15.         super(Math.max(2*c.size(), 11), .75f, true);  
  16.         addAll(c);  
  17.     }  
  18.     public Spliterator<E> spliterator() {  
  19.         return Spliterators.spliterator(this, Spliterator.DISTINCT | Spliterator.ORDERED);  
  20.     }  

上面就是LinkedHashSet的所有代碼了,是不是感覺智商被否定了,這基本上沒啥東西嘛,構造器還全部調用父類的,下面就是其父類HashSet的對此的構造方法 

  1. HashSet(int initialCapacity, float loadFactor, boolean dummy) {  
  2.     map = new LinkedHashMap<>(initialCapacity, loadFactor); 
  3.  

大家也看出來,和我們的猜測一樣,沒有深究下去的必要了。如果有興趣可以看看LinkedHashMap如何保證順序性

在看一下TreeSet 

  1. public class TreeSet<E> extends AbstractSet<E>  
  2.     implements NavigableSet<E>, Cloneable, java.io.Serializable 
  3.  
  4.  public TreeSet() {  
  5.         this(new TreeMap<E,Object>());  
  6.     }  
  7.     public TreeSet(Comparator<? super E> comparator) { 
  8.         this(new TreeMap<>(comparator));  
  9.     }  
  10.     public TreeSet(Collection<? extends E> c) {  
  11.         this();  
  12.         addAll(c);  
  13.     }  
  14.     public TreeSet(SortedSet<E> s) {  
  15.         this(s.comparator());  
  16.         addAll(s);  
  17.     }  

確實如我們所猜測,TreeSet也完全依賴于TreeMap來實現,如果有興趣可以看看TreeMap原理實現及常用方法

七. 總結

本來想三章的內容,一章就算完了,雖然Set實現有點賴皮,畢竟他祖輩是Collection而不是Map,在Map的實現類上穿了一層衣服就成了Set,然后出于某種目的埋伏在Collection中,哈哈,開個玩笑,本文主要介紹了HashSet的原理以及主要方法,同時簡單介紹了LinkedHashSet和TreeSet,若有不對之處,請批評指正,望共同進步,謝謝! 

 

責任編輯:龐桂玉 來源: Java知音
相關推薦

2009-06-12 10:48:33

Java Date

2021-08-19 10:30:13

Java集合排序程序開發

2009-06-12 10:34:40

Java Date

2021-04-12 10:02:02

JavaList集合

2021-04-15 10:00:46

Java基礎ListJava開發

2021-07-05 10:00:31

JavaStack基礎

2024-07-29 00:01:00

2023-11-23 06:51:50

PandasPython

2022-06-10 08:17:52

HashMap鏈表紅黑樹

2023-12-01 11:13:50

JavaTreeSet

2009-06-12 09:46:40

Java String

2022-09-06 11:13:16

接口PipelineHandler

2019-11-19 08:04:16

JavaHashSet去重

2020-09-04 13:30:43

Java自定義代碼

2009-05-21 09:28:20

C#DatagridVie操作

2022-06-07 08:31:44

JavaUnsafe

2023-03-13 17:18:09

OkHttp同步異步

2020-12-04 14:31:45

大數據Spark

2023-01-05 11:27:27

技術架構

2011-12-20 15:52:03

PhoneGap架構基礎工作原理
點贊
收藏

51CTO技術棧公眾號

亚洲男人第一av网站| 精品日本高清在线播放| 亚洲aaa激情| 久久婷婷国产麻豆91| 日韩av影院| 欧美视频完全免费看| 一区二区精品在线| 秋霞av鲁丝片一区二区| 久久久久国产精品一区三寸| 久久精品视频在线播放| 久久人人爽人人人人片| 久久久国产精品网站| 亚洲狠狠爱一区二区三区| 日韩高清三级| 好吊色视频一区二区| 免费黄网站欧美| 91po在线观看91精品国产性色| 少妇一级黄色片| 精品丝袜久久| 91精品蜜臀在线一区尤物| 日韩黄色片视频| 羞羞视频在线观看不卡| 中文在线免费一区三区高中清不卡| 97夜夜澡人人双人人人喊| 波多野结衣视频观看| 精品不卡视频| 日韩视频在线免费| 男女做爰猛烈刺激| 国产精品极品国产中出| 777欧美精品| 精品久久久久久久免费人妻| 麻豆蜜桃在线| 一区免费观看视频| 午夜精品亚洲一区二区三区嫩草 | 久久久www| 欧美片一区二区三区| 国产午夜精品久久久久久久久| youjizzjizz亚洲| 91麻豆精品国产91久久久资源速度 | 国产噜噜噜噜久久久久久久久| 久久午夜免费视频| 在线看片一区| 欧美激情区在线播放| 中日韩一级黄色片| 欧美成人直播| 日韩性生活视频| 四虎国产精品成人免费入口| 香蕉久久夜色精品国产使用方法| 日韩精品一区二区三区在线| 在线一区二区不卡| 亚洲影视资源| 欧美群妇大交群中文字幕| 浓精h攵女乱爱av| 日本肉肉一区| 欧美日韩精品一区二区| 好男人www社区| 全球最大av网站久久| 日韩欧美黄色动漫| 免费激情视频在线观看| 吞精囗交69激情欧美| 日韩欧美中文字幕在线观看| 99精品在线免费视频| 欧美日韩国产观看视频| 欧美视频不卡中文| 国产一区视频免费观看| 日韩精品影片| 欧美日韩国产首页| 天天干天天色天天干| 精品视频91| 欧美成人精精品一区二区频| 人妻体内射精一区二区三区| 另类春色校园亚洲| 亚洲午夜未删减在线观看| 超碰人人人人人人人| 一个色综合网| 久久久在线视频| 五月婷婷色丁香| 久久久精品五月天| 成人精品在线视频| 免费观看国产视频| 久久精品一区蜜桃臀影院| 视频一区视频二区视频三区视频四区国产| av中文字幕在线| 亚洲精选一二三| 国产午夜福利在线播放| 国产一区二区主播在线| 欧美一卡二卡在线观看| 欧美激情一区二区三区p站| 在线成人动漫av| 日韩在线观看免费全| 永久久久久久久| 亚洲伊人观看| 成人黄色在线观看| 成人久久精品人妻一区二区三区| 久久久综合精品| 一本一道久久久a久久久精品91| 黄色大片在线| 欧美视频日韩视频| 亚洲天堂av网站| 日韩久久精品| 97超级碰碰碰| 国产精品自拍电影| 久久久久久免费网| 日韩欧美视频免费在线观看| 成人影院入口| 欧美一区二区三区日韩视频| 一区二区黄色片| 欧美日韩中文| 国产日韩精品电影| 香蕉av在线播放| 亚洲精品视频一区二区| 玩弄japan白嫩少妇hd| 日韩精品视频一区二区三区| 亚洲视频777| 国产一级片免费观看| 久久成人综合网| 欧洲精品国产| 国产乱妇乱子在线播视频播放网站| 欧美在线观看18| 亚洲国产精品自拍视频| 欧美视频久久| 成人免费午夜电影| 超碰97在线免费观看| 黑人狂躁日本妞一区二区三区 | 青青草这里只有精品| 久久精品91久久久久久再现| 午夜影院免费在线观看| 岛国一区二区三区| 亚洲色图都市激情| 日本一区二区三区中文字幕| 亚洲一二在线观看| 在线精品免费视| 99精品欧美一区二区三区综合在线| 国产日韩欧美大片| 成人豆花视频| 久久久国产精品一区| 中文区中文字幕免费看| 久久久亚洲精品石原莉奈| 日本久久久网站| 欧美视频三区| 美日韩精品视频免费看| 夜夜嗨av禁果av粉嫩avhd| 亚洲国产精品高清| 国产视频一区二区三区在线播放 | 亚洲加勒比久久88色综合| 日本青青草视频| 国产毛片精品一区| 欧美性受xxxx黑人猛交88| 日韩一级视频| 久久夜色撩人精品| 国产精品久久久久毛片| 国产精品美女久久久久久久| 国产又大又黄又猛| 日韩精品1区| 成人黄色免费片| 超碰人人在线| 精品日韩欧美一区二区| 日韩av在线播| 久久免费看少妇高潮| 欧美激情国产精品日韩| 国产精品一区高清| 国产精品视频精品视频| 麻豆传媒视频在线| 欧美不卡一区二区三区四区| 国产午夜福利精品| 久久免费国产精品| 欧美第一页浮力影院| 亚洲色图国产| 国产一区二区三区高清视频| 国产美女高潮在线观看| 亚洲欧洲在线观看| 亚洲手机在线观看| 一级特黄大欧美久久久| 自拍视频一区二区| 日韩国产精品久久| 欧美日韩一级在线| 精品欧美午夜寂寞影院| 日本高清不卡在线| 国产传媒在线播放| 精品久久国产字幕高潮| 国产中文字幕视频| 国产精品国产精品国产专区不蜜| 中国老熟女重囗味hdxx| 亚洲手机视频| 日韩精品第一页| 日本少妇精品亚洲第一区| 97成人在线视频| 一级毛片视频在线| 亚洲成人久久一区| 国语对白做受69按摩| 亚洲精品午夜久久久| 亚洲欧美日本一区| 国产综合色视频| 亚洲 自拍 另类小说综合图区| 国产剧情在线观看一区| 亚洲综合自拍一区| 刘亦菲一区二区三区免费看| 久久久国产一区| 免费黄网站在线观看| 日韩亚洲欧美综合| 波多野结衣在线观看视频| 一区二区三区日韩精品视频| 欧美成人国产精品一区二区| 国产成人精品亚洲777人妖| 999香蕉视频| 激情视频一区| avove在线观看| 欧美裸体在线版观看完整版| 国产66精品久久久久999小说| 巨胸喷奶水www久久久免费动漫| 欧美精品video| 国产不卡在线| 国产香蕉一区二区三区在线视频| www.激情五月| 制服丝袜中文字幕一区| 久久中文字幕免费| 亚洲成人精品一区二区| 懂色av粉嫩av蜜臀av一区二区三区| 99国产精品久久久| 95视频在线观看| 国产成人综合在线播放| xxxx一级片| 国产精品五区| 激情伊人五月天| 亚洲黄色精品| 成人污网站在线观看| 日韩在线观看| 午夜一区二区三视频在线观看| 日韩在线黄色| 国产日韩在线一区二区三区| 国产精品1区在线| 91精品国产综合久久香蕉| 精品视频在线一区二区在线| 5278欧美一区二区三区| 成人免费观看在线观看| 欧美激情一区二区三区高清视频| 丝袜国产在线| 欧美成年人视频网站| 精品自拍一区| 麻豆国产精品va在线观看不卡| 尤物在线视频| xxx一区二区| 国产在线高清视频| 久久九九热免费视频| 国产美女av在线| 日韩网站在线观看| 在线三级中文| 色与欲影视天天看综合网| 色呦呦在线看| 久久久久久久999精品视频| 免费毛片在线看片免费丝瓜视频| 欧美激情按摩在线| 成人性生交大片免费看网站 | 一区二区三区亚洲| 国产精品麻豆一区二区三区| 国产一区二区三区在线观看网站| 国产女主播在线直播| 中文字幕亚洲专区| 女女色综合影院| 久久艹在线视频| 草莓视频丝瓜在线观看丝瓜18| 久久全球大尺度高清视频| 国产精品一二三产区| 日本欧美精品在线| 精品123区| 91中文字幕一区| 99热这里只有精品首页| 久久综合中文色婷婷| 精品久久久中文字幕| 一区视频二区视频| 欧美+亚洲+精品+三区| 日韩国产一级片| 日日夜夜精品免费视频| 国产精品自在自线| 成人免费看视频| 精品无码在线观看| 亚洲色图制服丝袜| 日韩黄色在线视频| 欧美丝袜丝交足nylons图片| 99久久免费国产精精品| 亚洲精品白浆高清久久久久久| 欧美黄色小说| 九九热精品视频国产| 波多野结衣视频一区二区| 国产精品18久久久久久首页狼| 国产va免费精品观看精品| 国产日韩在线一区二区三区| 日本久久黄色| 免费在线看黄色片| 免费视频一区二区| 男人网站在线观看| 国产精品美女久久久久高潮| 日本在线视频免费观看| 欧美日韩日本视频| 五月色婷婷综合| 日韩视频免费观看| 不卡福利视频| 超碰97国产在线| 色777狠狠狠综合伊人| 少妇高潮毛片色欲ava片| 精品综合久久久久久8888| 污片免费在线观看| 自拍偷拍欧美激情| aaa在线视频| 精品国产一区二区三区忘忧草 | 日本一区视频| 欧美理论电影在线观看| 九九九伊在线综合永久| 国产欧美日韩综合精品二区| 国产精品久久久久无码av| 欧美aⅴ在线观看| 成人精品一区二区三区中文字幕| 国产三级短视频| 狠狠躁18三区二区一区| 国产ts人妖调教重口男| 日韩中文字幕免费看| 韩漫成人漫画| 国产一区二区三区黄| 国内精品久久久久久久97牛牛| 中文字幕视频在线免费观看| 久久嫩草精品久久久精品| 日韩三级av在线| 日韩欧美一级二级三级| 日本免费在线观看| 国产精品狼人色视频一区| 亚洲精品推荐| av网站在线观看不卡| 99久久国产综合色|国产精品| 青娱乐国产在线视频| 8x福利精品第一导航| 日本高清视频在线观看| 国产精品久久久久久久久久东京| 日韩av影院| 亚洲中文字幕无码不卡电影| av在线综合网| 国产精品第9页| 日韩大片在线观看视频| a'aaa级片在线观看| 国产精品成人一区二区三区| 国产精品chinese| 中文字幕无人区二| 亚洲一区二区高清| 亚洲乱码国产乱码精品精软件| 色综合久综合久久综合久鬼88| 国产一区二区三区免费在线| 欧美日韩一区二区三区电影| 久久99久久精品| 亚洲最大的黄色网址| 欧美一级欧美一级在线播放| 午夜影院免费在线| 国产乱码精品一区二区三区中文| 欧美日韩视频一区二区三区| 午夜男人的天堂| 欧美日韩国产丝袜另类| 日韩av资源站| 国产欧美精品在线播放| 婷婷亚洲综合| 日韩精品xxx| 天涯成人国产亚洲精品一区av| 十八禁一区二区三区| 欧美在线不卡区| 精品视频免费| 图片区乱熟图片区亚洲| 亚洲成人免费观看| 欧美色综合一区二区三区| 国产精品久久久久免费a∨大胸| 日韩在线观看电影完整版高清免费悬疑悬疑| 国产精品自在自线| 亚洲高清一区二区三区| 日本人妖在线| 成人国产精品日本在线| 欧美精品97| 黄色软件在线| 欧美成人一区二区三区片免费| 色呦呦网站在线观看| 好吊色欧美一区二区三区视频| 香蕉成人久久| 欧美xxxx精品| 精品国产人成亚洲区| 日本免费久久| 激情图片qvod| 91在线精品秘密一区二区| 中文字幕欧美在线观看| 欧美日韩成人网| 婷婷亚洲精品| 久久精品视频在线观看免费| 午夜欧美视频在线观看| aaa在线观看| 国产日韩欧美亚洲一区| 男女男精品视频| 日本五十路女优| 最近2019年好看中文字幕视频| 一区二区精彩视频| 91香蕉视频污版| 亚洲mv在线观看| 秋霞午夜在线观看| 美脚丝袜一区二区三区在线观看| 国内精品国产三级国产a久久| 在线能看的av| 欧美丰满少妇xxxxx|