CodeGym /Java Blog /Toto sisi /Java 中的鏈接哈希集
John Squirrels
等級 41
San Francisco

Java 中的鏈接哈希集

在 Toto sisi 群組發布
說到Java中的LinkedHashSet類,就不得不提到它實現了Set接口。LinkedHashSet創建一個集合,該集合將元素存儲在哈希表中,但與對應的HashSet不同,它維護元素的插入順序。

什麼是 Java 中的設置

讓我們簡單回顧一下,Set接口定義了一個集合(set)。它擴展了Collection並定義了不允許重複元素的集合的行為。因此,如果嘗試向集合中添加重複元素,add()方法將返回false 。該接口沒有定義自己的任何其他方法。Set接口負責存儲對象的唯一性,唯一性由 equals() 方法的實現決定。因此,如果要將創建的類的對象添加到 Set 中最好重寫equals()方法。

LinkedHashSet 類

在說LinkedHashSet類之前,我們需要先提一下它的近親HashSet類。HashSet實現了Set接口。它創建一個集合,將元素存儲在哈希表中。哈希表的元素存儲為鍵值對。鍵指定存儲值的單元格(或段)。密鑰的內容用於確定稱為哈希碼的唯一值。我們可以將哈希碼視為對象標識符,儘管它不一定是唯一的。此散列碼還用作存儲與密鑰關聯的數據的索引。LinkedHashSet Java 類在不添加任何新方法的情況下擴展HashSetLinkedHashSet允許您快速檢查條目是否存在,就像HashSet一樣,但內部包含一個有序列表。這意味著它存儲元素的插入順序。換句話說,LinkedHashSet按照插入順序維護集合元素的鍊錶。這允許有序迭代插入到集合中。但是這會導致LinkedHashSet類執行操作的時間比HashSet類長。

LinkedHashSet 的重要特性

  • 我們只能在LinkedHashSet中存儲唯一元素

  • LinketHashSet讓我們按照插入的順序提取元素

  • LinkedHashSet未同步

  • LinkedHashSet允許存儲空元素

  • LinkedHashSet使用哈希技術根據哈希碼將元素存儲在指定索引處

LinkedHashSet 方法

HashSet除了從其父類繼承的方法外,還定義了以下方法:
  • boolean add(Object o)將指定的元素添加到此集合中(如果它不存在)。

  • void clear()從此集合中刪除所有元素。

  • 對象 clone()返回此LinkedHashSet實例的淺表副本:元素本身未被克隆。

  • boolean contains(Object o)如果此集合包含指定元素,則返回 true。

  • boolean isEmpty()如果此集合不包含任何元素,則返回true 。

  • 迭代器 iterator()返回此集合元素的迭代器。

  • boolean remove(Object o)從此集合中移除指定元素(如果存在)。

  • int size()返回此集合中的元素數(它的元素數)。

簡單的 LinkedHashSet 示例在下面的示例中,我們展示了 LinkedHashSet對象的初始化並使用 add()方法填充集合。

import java.util.LinkedHashSet;
import java.util.Set;

   public class LinkedHashSetEx1 {
       public static void main(String[] args) {
//LinkedHashSet() Init            
Set<String> set = new LinkedHashSet<>();
//adding elements to LinkedHashSet 
           set.add("Re"); //first added element 
           set.add("Do");
           set.add("Fa");
           set.add("Sol");
           set.add("La");
           set.add("Ti");
           set.add("Mi");//last added element  


           System.out.println(set);
       }
   }
輸出是:
[Re, Do, Fa, Sol, La, Ti, Mi]
如您所見,我們集合中的元素出現的順序與我們放置它們的順序相同。 Java 中的 LinkedHashSet - 1

示例 2. 將副本添加到 LinkedHashSet

讓我們再次放入帶有樂譜名稱的 LinkedHashSet 7 個元素,並放入一個與之前放置的元素相同的新元素。

import java.util.LinkedHashSet;
import java.util.Set;

public class LinkedHashSetEx2 {
   public static void main(String[] args) {
           Set<String> set = new LinkedHashSet<>();
           set.add("Re");
           set.add("Do");
           set.add("Fa");
           set.add("Sol");
           set.add("La");
           set.add("Ti");
           set.add("Mi");
           set.add("Sol");
           System.out.println(set);
       }
   }
該程序的輸出在這裡:
[Re, Do, Fa, Sol, La, Ti, Mi]
示例二的輸出與第一個示例中的完全相同。 LinkedHashSet集合中不能有兩個相似的元素。當我們嘗試放置第二個時,它就被忽略了。

示例 3. 從 LinkedHashSet 中刪除元素


import java.util.LinkedHashSet;
import java.util.Set;
   public class LinkedHashSet3 {
       public static void main(String[] args) {
           Set<String> set = new LinkedHashSet<>();
           set.add("Re");
           set.add("Do");
           set.add("Fa");
           set.add("Sol");
           set.add("La");
           set.add("Ti");
           set.add("Mi");
           System.out.println(set);
           set.remove("Fa");// removing an element from our set
           set.remove("Score");//trying to remove element that isn't in set
           System.out.println(set.remove("Score"));
           System.out.println("Print our set without elements removed: ");
           System.out.println(set);
           set.clear();
           System.out.println("Print out our set after clear command: ");
           System.out.println(set);
       }
   }
該程序的輸出在這裡:
[Re, Do, Fa, Sol, La, Ti, Mi] false 在不刪除元素的情況下打印我們的集合:[Re, Do, Sol, La, Ti, Mi] 在清除命令後打印我們的集合:[]
如您所見,應用於不存在元素的 remove()方法不會導致程序錯誤。如果元素未被刪除,它只返回 false ;如果元素在 LinkedHashSet中然後被刪除,則返回 true 。

LinkedHashSet 與 HashSet

這兩個階級是近親。但是在 HashSet內部,它使用 HashMap來存儲對象,而 LinkedHashSet使用 LinkedHashMap。如果不需要維護插入順序但需要存儲唯一對象,使用 HashSet更合適。如果您需要維護元素的插入順序,那麼 LinkedHashSet是您的選擇。 LinkedHashSet的性能比 HashSet慢一點,因為 LinkedHashSet使用內部的 LinkedList來維護元素的插入順序。讓我們舉個例子:

import java.util.*;

public class LinkedHashSetExample1 {

   public static void main(String[] args) {
       // while regular hash set orders its elements according to its hashcode stamps

       Set<Integer> regularHashSet = new HashSet<>();
       regularHashSet.add(7);
       regularHashSet.add(3);
       regularHashSet.add(5);
       regularHashSet.add(65536);
       regularHashSet.add(9);
       // few duplicates
       regularHashSet.add(5);
       regularHashSet.add(7);

       // next will print:
       // > regularHashSet = [65536, 3, 5, 7, 9]
       System.out.println("regularHashSet = " + regularHashSet);

       // linked hash set keeps order of adding unchanged

       Set<Integer> linkedHashSet = new LinkedHashSet<>();
       linkedHashSet.add(7);
       linkedHashSet.add(3);
       linkedHashSet.add(5);
       linkedHashSet.add(65536);
       linkedHashSet.add(9);
       // few duplicates
       linkedHashSet.add(5);
       linkedHashSet.add(7);

       // next will print:
       // > linkedHashSet = [7, 3, 5, 65536, 9]
       System.out.println("linkedHashSet = " + linkedHashSet);
   }
}
該程序的輸出是:
regularHashSet = [65536, 3, 5, 7, 9] linkedHashSet = [7, 3, 5, 65536, 9]

在實際應用程序中使用 Java LinkedHashSet

由於 LinkedHashSet允許您快速檢查條目是否存在並存儲順序,因此此集合似乎非常便於從列表中刪除重複項。或者,例如,解決像我包裡最近看到的物品這樣的問題。或者,還記得這樣一款遊戲嗎,Pokemon Go? LinkedHashSet可以存儲您遇到的 Pokémon 列表以及它們在您的路徑上遇到的順序。在這種情況下,“重複”的神奇寶貝將不再添加到列表中。或者,例如,您在任何有關卡的遊戲中遇到過的按關卡分類的 Boss 列表。或者宇宙天體的發現史。 鏈接哈希集允許您快速檢查一個空間體是否已經在列表中,如果不存在,則將其添加到列表中。讓我們舉一個消除重複的例子。

import java.util.*;

class LinkedHashSetExample2 {
   public static void main(String[] args) {
       List<String> listWithDuplicates = List.of("some","elements","with", "few", "duplicates", "were", "here", "duplicates", "duplicates");

       Set<String> linkedHashSet = new LinkedHashSet<>(listWithDuplicates);
       List<String> listWithoutDuplicates = new ArrayList<>(linkedHashSet);

       // next will print:
       // > listWithDuplicates = [some, elements, with, few, duplicates, here, duplicates, duplicates]
       System.out.println("listWithDuplicates = " + listWithDuplicates);
       // next will print:
       // > listWithoutDuplicates = [some, elements, with, few, duplicates, here]
       System.out.println("listWithoutDuplicates = " + listWithoutDuplicates);

       // -------------------------------------------------------------------------

       // while using regular Hash Set will generally produces some unexpected order
       Set<String> regularHashSet = new HashSet<>(listWithDuplicates);

       // next will print:
       // > linkedHashSet = [some, elements, with, few, duplicates, were, here]
       System.out.println("linkedHashSet = " + linkedHashSet);
       // next will print:
       // > regularHashSet = [here, some, with, duplicates, were, elements, few]
       System.out.println("regularHashSet = " + regularHashSet);
   }
}
該程序的輸出在這裡:
listWithDuplicates = [一些,元素,有,很少,重複,在這裡,重複,重複] listWithoutDuplicates = [一些,元素,有,很少,重複,在這裡] , were, here] regularHashSet = [here, some, with, duplicates, were, elements, few]
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION