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

首頁 > 學院 > 開發(fā)設計 > 正文

HashSet

2019-11-11 02:47:02
字體:
來源:轉載
供稿:網(wǎng)友

在前篇博文中(java提高篇(二三)-----HashMap)詳細講解了HashMap的實現(xiàn)過程,對于HashSet而言,它是基于HashMap來實現(xiàn)的,底層采用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類,實現(xiàn)Set、Cloneable、Serializable接口。其中AbstractSet提供%20Set%20接口的骨干實現(xiàn),從而最大限度地減少了實現(xiàn)此接口所需的工作。Set接口是一種不包括重復元素的Collection,它維持它自己的內部排序,所以隨機訪問沒有任何意義。

       基本屬性

[java] view%20plain copy //基于HashMap實現(xiàn),底層使用HashMap保存所有元素  /**          * 默認構造函數(shù)          * 初始化一個空的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中我沒有看到這個構造函數(shù),今天看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中的元素的數(shù)量(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保持不變,所以如果將一個已經(jīng)存在的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實現(xiàn),使其的實現(xiàn)過程變得非常簡單,如果你對HashMap比較了解,那么HashSet簡直是小菜一碟。有兩個方法對HashMap和HashSet而言是非常重要的,下篇將詳細講解hashcode和equals。

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


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 桃园县| 宜丰县| 德保县| 启东市| 崇信县| 百色市| 依安县| 靖安县| 金湖县| 宁晋县| 尼木县| 邵阳市| 白城市| 攀枝花市| 天津市| 中方县| 抚宁县| 惠州市| 固阳县| 綦江县| 和龙市| 葵青区| 桦南县| 永胜县| 藁城市| 阿荣旗| 平顺县| 广元市| 安阳县| 巴南区| 皋兰县| 平顺县| 启东市| 普定县| 元谋县| 湖北省| 邢台县| 民丰县| 广州市| 调兵山市| 延边|