国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

HashSet

2019-11-11 01:37:33
字體:
來源:轉載
供稿:網友

在前篇博文中(java提高篇(二三)-----HashMap)詳細講解了HashMap的實現過程,對于HashSet而言,它是基于HashMap來實現的,底層采用HashMap來保存元素。所以如果對HashMap比較熟悉,那么HashSet是so easy!!

一、定義

[java] view plain copy 在CODE上查看代碼片public class HashSet<E>      extends AbstractSet<E>      implements Set<E>, Cloneable, java.io.Serializable  

      %20HashSet繼承AbstractSet類,實現Set、Cloneable、Serializable接口。其中AbstractSet提供%20Set%20接口的骨干實現,從而最大限度地減少了實現此接口所需的工作。Set接口是一種不包括重復元素的Collection,它維持它自己的內部排序,所以隨機訪問沒有任何意義。

       基本屬性

[java] view%20plain copy //基于HashMap實現,底層使用HashMap保存所有元素  /**          * 默認構造函數          * 初始化一個空的HashMap,并使用默認初始容量為16和加載因子0.75。          */          public HashSet() {              map = new HashMap<>();          }                    /**          * 構造一個包含指定 collection 中的元素的新 set。          */          public HashSet(Collection<? extends E> c) {              map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));              addAll(c);          }                    /**          * 構造一個新的空 set,其底層 HashMap 實例具有指定的初始容量和指定的加載因子          */          public HashSet(int initialCapacity, float loadFactor) {              map = new HashMap<>(initialCapacity, loadFactor);          }                       /**          * 構造一個新的空 set,其底層 HashMap 實例具有指定的初始容量和默認的加載因子(0.75)。          */          public HashSet(int initialCapacity) {             map = new HashMap<>(initialCapacity);          }                       /**          * 在API中我沒有看到這個構造函數,今天看public Iterator<E> iterator() {          return map.keySet().iterator();      }  

       iterator()方法返回對此%20set%20中元素進行迭代的迭代器。返回元素的順序并不是特定的。底層調用HashMap的keySet返回所有的key,這點反應了HashSet中的所有元素都是保存在HashMap的key中,value則是使用的PRESENT對象,該對象為static%20final。

[java] view%20plain copy public int size() {          return map.size();      }  

       size()返回此%20set%20中的元素的數量(set%20的容量)。底層調用HashMap的size方法,返回HashMap容器的大小。

[java] view%20plain copy public boolean isEmpty() {          return map.isEmpty();      }  

       isEmpty(),判斷HashSet()集合是否為空,為空返回 true,否則返回false

[java] view%20plain copy public boolean contains(Object o) {          return map.containsKey(o);      }  

       contains(),判斷某個元素是否存在于HashSet()中,存在返回true,否則返回false。更加確切的講應該是要滿足這種關系才能返回true:(o==null%20?%20e==null%20:%20o.equals(e))。底層調用containsKey判斷HashMap的key值是否為空。

[html] view%20plain copy public boolean add(E e) {          return map.put(e, PRESENT)==null;      }  

       add()如果此%20set%20中尚未包含指定元素,則添加指定元素。如果此Set沒有包含滿足(e==null%20?%20e2==null%20:%20e.equals(e2))%20的e2時,則將e2添加到Set中,否則不添加且返回false。由于底層使用HashMap的put方法將key%20=%20e,value=PRESENT構建成key-value鍵值對,當此e存在于HashMap的key中,則value將會覆蓋原有value,但是key保持不變,所以如果將一個已經存在的e元素添加中HashSet中,新添加的元素是不會保存到HashMap中,所以這就滿足了HashSet中元素不會重復的特性。

[java] view%20plain copy public boolean remove(Object o) {          return map.remove(o)==PRESENT;      }  

       remove如果指定元素存在于此%20set%20中,則將其移除。底層使用HashMap的remove方法刪除指定的Entry。

[java] view%20plain copy public void clear() {          map.clear();      }  

       clear從此%20set%20中移除所有元素。底層調用HashMap的clear方法清除所有的Entry。

[java] view%20plain copy 派生到我的代碼片public Object clone() {          try {              HashSet<E> newSet = (HashSet<E>) super.clone();              newSet.map = (HashMap<E, Object>) map.clone();              return newSet;          } catch (CloneNotSupportedException e) {              throw new InternalError();          }      }  

       clone返回此 HashSet 實例的淺表副本:并沒有復制這些元素本身。

       后記:

       由于HashSet底層使用了HashMap實現,使其的實現過程變得非常簡單,如果你對HashMap比較了解,那么HashSet簡直是小菜一碟。有兩個方法對HashMap和HashSet而言是非常重要的,下篇將詳細講解hashcode和equals。

-------------------------------------------------------------------------------------------------


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 常德市| 桃园县| 雅安市| 怀安县| 昌乐县| 达孜县| 合江县| 土默特右旗| 铜川市| 宁远县| 措美县| 南溪县| 米脂县| 裕民县| 洛隆县| 洛阳市| 河东区| 成都市| 宜都市| 旅游| 封丘县| 石泉县| 伊川县| 永善县| 龙游县| 新泰市| 泽普县| 巴彦县| 昌乐县| 长岛县| 社旗县| 同仁县| 焦作市| 五大连池市| 陆河县| 淄博市| 金昌市| 三门县| 禹州市| 浦北县| 阳朔县|