說到Java中的LinkedHashSet類,就不得不提到它實現了Set接口。LinkedHashSet創建一個集合,該集合將元素存儲在哈希表中,但與對應的HashSet不同,它維護元素的插入順序。
簡單的 LinkedHashSet 示例在下面的示例中,我們展示了
LinkedHashSet對象的初始化並使用
add()方法填充集合。
什麼是 Java 中的設置
讓我們簡單回顧一下,Set接口定義了一個集合(set)。它擴展了Collection並定義了不允許重複元素的集合的行為。因此,如果嘗試向集合中添加重複元素,add()方法將返回false 。該接口沒有定義自己的任何其他方法。Set接口負責存儲對象的唯一性,唯一性由 equals() 方法的實現決定。因此,如果要將創建的類的對象添加到 Set 中,最好重寫equals()方法。LinkedHashSet 類
在說LinkedHashSet類之前,我們需要先提一下它的近親HashSet類。HashSet實現了Set接口。它創建一個集合,將元素存儲在哈希表中。哈希表的元素存儲為鍵值對。鍵指定存儲值的單元格(或段)。密鑰的內容用於確定稱為哈希碼的唯一值。我們可以將哈希碼視為對象標識符,儘管它不一定是唯一的。此散列碼還用作存儲與密鑰關聯的數據的索引。LinkedHashSet Java 類在不添加任何新方法的情況下擴展了HashSet。LinkedHashSet允許您快速檢查條目是否存在,就像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()返回此集合中的元素數(它的元素數)。
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]
如您所見,我們集合中的元素出現的順序與我們放置它們的順序相同。

示例 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]
GO TO FULL VERSION