在本教程中,我們將借助示例學(xué)習(xí)Java LinkedHashSet類及其方法。
Java集合框架的LinkedHashSet類提供了哈希表和鏈接列表數(shù)據(jù)結(jié)構(gòu)的功能。
它實(shí)現(xiàn)Set接口。
LinkedHashSet的元素存儲(chǔ)在類似于HashSet的哈希表中。
但是,鏈表哈希集合在內(nèi)部為其所有元素維護(hù)一個(gè)雙鏈表。鏈表定義了在哈希表中插入元素的順序。
為了創(chuàng)建鏈表的哈希集,我們必須首先導(dǎo)入java.util.LinkedHashSet包。
導(dǎo)入包后,就可以在Java中創(chuàng)建鏈表的哈希集。
//具有8個(gè)容量和0.75負(fù)載因子的LinkedHashSet LinkedHashSet<Integer> numbers = new LinkedHashSet<>(8, 0.75);
在這里,我們創(chuàng)建了一個(gè)名為numbers的鏈表哈希集合。
注意,語(yǔ)句 new LinkedHashSet<>(8, 0.75)。在這里,第一個(gè)參數(shù)是容量,第二個(gè)參數(shù)是負(fù)載因子。
capacity - 該哈希集的容量為8。意味著,它可以存儲(chǔ)8個(gè)元素。
loadFactor- 此哈希集的負(fù)載因子為0.6。這意味著,只要我們的哈希表填充了60%,元素就會(huì)移動(dòng)到新哈希表中,該哈希表的大小是原始哈希表的兩倍。
默認(rèn)容量和負(fù)載因子
可以在不定義其容量和負(fù)載因子的情況下創(chuàng)建鏈表的哈希集合。例如,
//具有默認(rèn)容量和負(fù)載因子的LinkedHashSet LinkedHashSet<Integer> numbers1 = new LinkedHashSet<>();
默認(rèn),
鏈接哈希集的容量將為16
負(fù)載因子將為0.75
這是我們?nèi)绾蝿?chuàng)建包含其他集合的所有元素的鏈接哈希集。
import java.util.LinkedHashSet; import java.util.ArrayList; class Main { public static void main(String[] args) { //創(chuàng)建偶數(shù)的arrayList ArrayList<Integer> evenNumbers = new ArrayList<>(); evenNumbers.add(2); evenNumbers.add(4); System.out.println("ArrayList: " + evenNumbers); //從ArrayList創(chuàng)建LinkedHashSet LinkedHashSet<Integer> numbers = new LinkedHashSet<>(evenNumbers); System.out.println("LinkedHashSet: " + numbers); } }
輸出結(jié)果
ArrayList: [2, 4] LinkedHashSet: [2, 4]
LinkedHashSet類提供了讓我們對(duì)所鏈表的哈希集合執(zhí)行各種操作方法。
add() - 將指定的元素插入鏈表的哈希集
addAll() - 將指定集合的所有元素插入鏈表的哈希集
例如,
import java.util.LinkedHashSet; class Main { public static void main(String[] args) { LinkedHashSet<Integer> evenNumber = new LinkedHashSet<>(); // 使用add()方法 evenNumber.add(2); evenNumber.add(4); evenNumber.add(6); System.out.println("LinkedHashSet: " + evenNumber); LinkedHashSet<Integer> numbers = new LinkedHashSet<>(); //使用addAll()方法 numbers.addAll(evenNumber); numbers.add(5); System.out.println("New LinkedHashSet: " + numbers); } }
輸出結(jié)果
LinkedHashSet: [2, 4, 6] New LinkedHashSet: [2, 4, 6, 5]
要訪問(wèn)鏈表的哈希集的元素,我們可以使用iterator()方法。為了使用此方法,我們必須導(dǎo)入java.util.Iterator包。例如,
import java.util.LinkedHashSet; import java.util.Iterator; class Main { public static void main(String[] args) { LinkedHashSet<Integer> numbers = new LinkedHashSet<>(); numbers.add(2); numbers.add(5); numbers.add(6); System.out.println("LinkedHashSet: " + numbers); //調(diào)用iterator()方法 Iterator<Integer> iterate = numbers.iterator(); System.out.print("使用Iterator的LinkedHashSet: "); //訪問(wèn)元素 while(iterate.hasNext()) { System.out.print(iterate.next()); System.out.print(", "); } } }
輸出結(jié)果
LinkedHashSet: [2, 5, 6] 使用Iterator的LinkedHashSet: 2, 5, 6,
注意事項(xiàng):
hasNext()返回true鏈接的哈希集中是否存在下一個(gè)元素
next() 返回鏈接的哈希集中的下一個(gè)元素
remove() - 從鏈表的哈希集中刪除指定的元素
removeAll() - 從鏈表的哈希集中刪除所有元素
例如,
import java.util.LinkedHashSet; class Main { public static void main(String[] args) { LinkedHashSet<Integer> numbers = new LinkedHashSet<>(); numbers.add(2); numbers.add(5); numbers.add(6); System.out.println("LinkedHashSet: " + numbers); //使用remove()方法 boolean value1 = numbers.remove(5); System.out.println("5被刪除? " + value1); boolean value2 = numbers.removeAll(numbers); System.out.println("是否刪除了所有元素? " + value2); } }
輸出結(jié)果
LinkedHashSet: [2, 5, 6] 5被刪除? true 是否刪除了所有元素? true
LinkedHashSet該類的各種方法也可以用于執(zhí)行各種Set操作。
執(zhí)行兩個(gè)集合之間的并集,我們可以使用addAll()方法。例如,
import java.util.LinkedHashSet; class Main { public static void main(String[] args) { LinkedHashSet<Integer> evenNumbers = new LinkedHashSet<>(); evenNumbers.add(2); evenNumbers.add(4); System.out.println("LinkedHashSet1: " + evenNumbers); LinkedHashSet<Integer> numbers = new LinkedHashSet<>(); numbers.add(1); numbers.add(3); System.out.println("LinkedHashSet2: " + numbers); //兩個(gè)集合的并集 numbers.addAll(evenNumbers); System.out.println("并集: " + numbers); } }
輸出結(jié)果
LinkedHashSet1: [2, 4] LinkedHashSet2: [1, 3] 并集: [1, 3, 2, 4]
要執(zhí)行兩個(gè)集合之間的交集,我們可以使用retainAll()方法。例如
import java.util.LinkedHashSet; class Main { public static void main(String[] args) { LinkedHashSet<Integer> primeNumbers = new LinkedHashSet<>(); primeNumbers.add(2); primeNumbers.add(3); System.out.println("LinkedHashSet1: " + primeNumbers); LinkedHashSet<Integer> evenNumbers = new LinkedHashSet<>(); evenNumbers.add(2); evenNumbers.add(4); System.out.println("LinkedHashSet2: " + evenNumbers); //集合的交集 evenNumbers.retainAll(primeNumbers); System.out.println("集合的交集: " + evenNumbers); } }
輸出結(jié)果
LinkedHashSet1: [2, 3] LinkedHashSet2: [2, 4] 集合的交集: [2]
要計(jì)算兩組之間的差集,我們可以使用removeAll()方法。例如,
import java.util.LinkedHashSet; class Main { public static void main(String[] args) { LinkedHashSet<Integer> primeNumbers = new LinkedHashSet<>(); primeNumbers.add(2); primeNumbers.add(3); primeNumbers.add(5); System.out.println("LinkedHashSet1: " + primeNumbers); LinkedHashSet<Integer> oddNumbers = new LinkedHashSet<>(); oddNumbers.add(1); oddNumbers.add(3); oddNumbers.add(5); System.out.println("LinkedHashSet2: " + oddNumbers); //LinkedHashSet1和LinkedHashSet2之間的差集 primeNumbers.removeAll(oddNumbers); System.out.println("差集: " + primeNumbers); } }
輸出結(jié)果
LinkedHashSet1: [2, 3, 5] LinkedHashSet2: [1, 3, 5] 差集: [2]
要檢查一個(gè)集合是否是另一個(gè)集合的子集,我們可以使用containsAll()方法。例如,
import java.util.LinkedHashSet; class Main { public static void main(String[] args) { LinkedHashSet<Integer> numbers = new LinkedHashSet<>(); numbers.add(1); numbers.add(2); numbers.add(3); numbers.add(4); System.out.println("LinkedHashSet1: " + numbers); LinkedHashSet<Integer> primeNumbers = new LinkedHashSet<>(); primeNumbers.add(2); primeNumbers.add(3); System.out.println("LinkedHashSet2: " + primeNumbers); //檢查primeNumbers是否是numbers的子集 boolean result = numbers.containsAll(primeNumbers); System.out.println("LinkedHashSet2是LinkedHashSet1的子集嗎? " + result); } }
輸出結(jié)果
LinkedHashSet1: [1, 2, 3, 4] LinkedHashSet2: [2, 3] LinkedHashSet2是LinkedHashSet1的子集嗎? true
方法 | 描述 |
---|---|
clone() | 創(chuàng)建LinkedHashSet副本 |
contains() | 在中搜索LinkedHashSet指定的元素,并返回布爾結(jié)果 |
isEmpty() | 檢查是否LinkedHashSet為空 |
size() | 返回LinkedHashSet的大小 |
clear() | 從LinkedHashSet中刪除所有元素 |
LinkedHashSet和HashSet都實(shí)現(xiàn)Set接口。 但是,它們之間存在一些差異。
LinkedHashSet在內(nèi)部維護(hù)一個(gè)鏈表。因此,它保持其元素的插入順序。
LinkedHashSet類比HashSet需要更多的存儲(chǔ)空間。這是因?yàn)長(zhǎng)inkedHashSet在內(nèi)部維護(hù)鏈表。
LinkedHashSet的性能比HashSet慢。這是因?yàn)長(zhǎng)inkedHashSet中存在鏈表。
以下是LinkedHashSet和TreeSet之間的主要區(qū)別:
TreeSet類實(shí)現(xiàn)了SortedSet接口。這就是為什么樹集中的元素是有序的。但是,LinkedHashSet類只維護(hù)其元素的插入順序。
TreeSet通常比LinkedHashSet慢。這是因?yàn)槊慨?dāng)將元素添加到TreeSet時(shí),它都必須執(zhí)行排序操作。