<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # Java `HashSet`類 > 原文: [https://howtodoinjava.com/java/collections/java-hashset/](https://howtodoinjava.com/java/collections/java-hashset/) Java `HashSet`類實現了`Set`接口,由哈希表(實際上是[`HashMap`](https://howtodoinjava.com/java-hashmap/)實例)支持。 如果不對迭代順序提供任何保證,并允許`null`元素。 ```java Table of Contents 1\. HashSet Hierarchy 2\. HashSet Features 3\. HashSet Constructors 4\. HashSet Methods 5\. HashSet Example 6\. HashSet Usecases 7\. HashSet Performance 8\. Conclusion ``` ## 1\. `HashSet`層次結構 `HashSet`類擴展了實現`Set`接口的`AbstractSet`類。 `Set`接口以層次結構順序繼承`Collection`和`Iterable`接口。 ```java public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, Serializable { //implementation } ``` ![HashSet Hierarchy](https://img.kancloud.cn/22/00/22008b9964ffbf80e9bd7d7e31a32016_819x509.png) 哈希集合層次結構 ## 2\. `HashSet`特性 * 它實現了`Set`接口。 * `HashSet`中不允許重復的值。 * `HashSet`中允許一個`NULL`元素。 * 它是無序集合,并且不保證集合的迭代順序。 * 此類為基本操作(添加,刪除,包含和調整大小)提供恒定的時間性能。 * `HashSet`不同步。 如果多個線程同時訪問哈希集合,并且至少有一個線程修改了哈希集合,則必須在外部對其進行同步。 * 使用`Collections.synchronizedSet(new HashSet())`方法來獲取同步的哈希集合。 * 此類的迭代器方法返回的迭代器為**快速失敗**,并且如果在創建迭代器后的任何時間修改了集合,則可能會拋出`ConcurrentModificationException`,除了通過迭代器自己的`remove()`方法之外 。 * `HashSet`還實現了`Searlizable`和[`Cloneable`](https://howtodoinjava.com/java/cloning/a-guide-to-object-cloning-in-java/)接口。 #### 2.1 初始容量 初始容量表示創建哈希集合時(在支持`HashMap`中)的存儲桶數。 如果當前大小已滿,則存儲桶數將自動增加。 默認初始容量為 **16** 。 我們可以通過在構造器`HashSet(int initialCapacity)`中傳遞默認容量來覆蓋此默認容量。 #### 2.2 負載系數 負載因子是在自動增加 HashSet 容量之前允許其充滿的度量。 默認負載系數為 **0.75** 。 這稱為**閾值**,等于(`DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY`)。 當`HashSet`元素計數超過此閾值時,將調整`HashSet`的大小,并且新容量將是先前容量的兩倍。 使用默認的`HashSet`時,內部容量為 16,負載系數為 0.75。 當表格中有 12 個元素時,存儲桶數將自動增加。 ## 3\. `HashSet`構造器 `HashSet`具有四種類型的構造器: 1. **`HashSet()`**:使用默認的初始容量(16)和默認的負載因子(0.75)初始化默認的`HashSet`實例。 2. **`HashSet(int capcity)`**:初始化具有指定容量和默認加載因子(0.75)的`HashSet`。 3. **`HashSet(int capcity, float loadFactor)`**:使用指定的初始容量和指定的負載系數初始化`HashSet`。 4. **`HashSet(Collection c)`**:使用與指定集合相同的元素初始化`HashSet`。 ## 4\. `HashSet`方法 1. **`public boolean add(E e)`**:如果指定的元素尚不存在,則將其添加到`Set`中。 此方法在內部使用`equals()`方法檢查重復項。 如果元素重復,則元素被拒絕,并且不替換值。 2. **`public void clear()`**:從哈希集合中刪除所有元素。 3. **`public boolean contains(Object o)`**:如果哈希集合包含指定的元素則返回`true`,否則為`false`。 4. **`public boolean isEmpty()`**:如果哈希集合不包含任何元素,則返回`true`,否則返回`false`。 5. **`public int size()`**:返回哈希集合中的元素數。 6. **`public Iterator<E> iterator()`**:在此哈希集合中的元素上返回迭代器。 從迭代器返回的元素沒有特定的順序。 7. **`public boolean remove(Object o)`**:從哈希集合中刪除指定的元素(如果存在)并返回`true`,否則返回`false`。 8. **`public boolean removeAll(Collection <?> c)`**:刪除哈希集合中所有屬于指定集合的??元素。 9. **`public Object clone()`**:返回哈希集合的淺表副本。 10. **`public Spliterator<E> spliterator()`**:在此哈希集合中的元素上創建后綁定且快速失敗的**拆分器**。 ## 5\. Java `HashSet`示例 #### 5.1 `HashSet`添加,刪除,迭代器示例 ```java //1\. Create HashSet HashSet<String> hashSet = new HashSet<>(); //2\. Add elements to HashSet hashSet.add("A"); hashSet.add("B"); hashSet.add("C"); hashSet.add("D"); hashSet.add("E"); System.out.println(hashSet); //3\. Check if element exists boolean found = hashSet.contains("A"); //true System.out.println(found); //4\. Remove an element hashSet.remove("D"); //5\. Iterate over values Iterator<String> itr = hashSet.iterator(); while(itr.hasNext()) { String value = itr.next(); System.out.println("Value: " + value); } ``` 程序輸出。 ```java [A, B, C, D, E] true Value: A Value: B Value: C Value: E ``` #### 5.2 將`HashSet`轉換為數組示例 Java 示例,使用`toArrray()`方法將哈希集合轉換為[數組](https://howtodoinjava.com/java-array/)。 ```java HashSet<String> hashSet = new HashSet<>(); hashSet.add("A"); hashSet.add("B"); hashSet.add("C"); hashSet.add("D"); hashSet.add("E"); String[] values = new String[hashSet.size()]; hashSet.toArray(values); System.out.println(Arrays.toString(values)); ``` 程序輸出: ```java [A, B, C, D, E] ``` #### 5.3 將`HashSet`轉換為`ArrayList`示例 使用 [Java 8 流 API](https://howtodoinjava.com/java8/java-8-tutorial-streams-by-examples/) 將哈希集合轉換為[`ArrayList`](https://howtodoinjava.com/java-arraylist/)的 Java 示例。 ```java HashSet<String> hashSet = new HashSet<>(); hashSet.add("A"); hashSet.add("B"); hashSet.add("C"); hashSet.add("D"); hashSet.add("E"); List<String> valuesList = hashSet.stream().collect(Collectors.toList()); System.out.println(valuesList); ``` 程序輸出: ```java [A, B, C, D, E] ``` ## 6\. `HashSet`用例 `HashSet`非常類似于`ArrayList`類。 此外,它還會限制重復值。 因此,當我們有一個只需要存儲不同元素的需求時,我們可以選擇`HashSet`。 `HashSet`的真實用例可以存儲流中的數據,其中流可能包含重復的記錄,而我們僅對不同的記錄感興趣。 另一個用例是在給定的句子中找到不同的單詞。 ## 7\. Java `HashSet`性能 * `HashSet`類為基本操作(添加,刪除,包含和大小)提供` O(1)`的**恒定時間性能**,假設哈希函數將元素正確分散在存儲桶中。 * 對此集合進行迭代需要的時間與`HashSet`實例的大小(元素的數量)加上后備`HashMap`實例的“容量”(存儲桶的數量)之和成比例。 因此,如果迭代性能很重要,則不要將初始容量設置得過高(或負載因子過低),這一點非常重要。 ## 8\. 總結 從上面的討論中可以明顯看出,在我們要處理重復記錄的情況下,`HashSet`是非常有用的集合類。 它為基本操作提供了可預測的性能。 在評論中向我發送有關 Java 中 **`HashSet`的問題**。 學習愉快! 參考: [HashSet Java 文檔](https://docs.oracle.com/javase/10/docs/api/java/util/HashSet.html)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看