LinkedHashSet
类是Java集合框架的一部分,它提供了哈希表和链表数据结构的功能。
它实现了Set接口。
LinkedHashSet
的元素存储在类似HashSet的哈希表中。
但是,链式哈希集在内部为所有元素维护一个双向链表。该链表定义了元素在哈希表中插入的顺序。
创建LinkedHashSet
为了创建链式哈希集,我们必须首先导入java.util.LinkedHashSet
包。
导入包后,我们可以这样在Java中创建链式哈希集。
// LinkedHashSet with 8 capacity and 0.75 load factor
LinkedHashSet<Integer> numbers = new LinkedHashSet<>(8, 0.75);
在这里,我们创建了一个名为numbers的链式哈希集。
请注意,new LinkedHashSet<>(8, 0.75)
部分。这里的第一个参数是容量,第二个参数是加载因子。
- 容量 - 此哈希集的容量为8。表示它可以存储8个元素。
- 加载因子 - 此哈希表的加载因子为0.6。这意味着,当我们的哈希表被填满60%时,元素将被移动到一个大小是原始哈希表两倍的新哈希表中。
默认容量和加载因子
可以创建不定义容量和加载因子的链式哈希集。例如,
// LinkedHashSet with default capacity and load factor
LinkedHashSet<Integer> numbers1 = new LinkedHashSet<>();
默认情况下,
- 链式哈希集的容量将是16
- 加载因子将为0.75
从其他集合创建LinkedHashSet
我们可以这样创建包含其他集合所有元素的链式哈希集。
import java.util.LinkedHashSet;
import java.util.ArrayList;
class Main {
public static void main(String[] args) {
// Creating an arrayList of even numbers
ArrayList<Integer> evenNumbers = new ArrayList<>();
evenNumbers.add(2);
evenNumbers.add(4);
System.out.println("ArrayList: " + evenNumbers);
// Creating a LinkedHashSet from an ArrayList
LinkedHashSet<Integer> numbers = new LinkedHashSet<>(evenNumbers);
System.out.println("LinkedHashSet: " + numbers);
}
}
输出
ArrayList: [2, 4] LinkedHashSet: [2, 4]
LinkedHashSet的方法
LinkedHashSet
类提供了允许我们对链式哈希集执行各种操作的方法。
向LinkedHashSet插入元素
add()
- 将指定元素插入链式哈希集addAll()
- 将指定集合的所有元素插入链式哈希集
例如,
import java.util.LinkedHashSet;
class Main {
public static void main(String[] args) {
LinkedHashSet<Integer> evenNumber = new LinkedHashSet<>();
// Using add() method
evenNumber.add(2);
evenNumber.add(4);
evenNumber.add(6);
System.out.println("LinkedHashSet: " + evenNumber);
LinkedHashSet<Integer> numbers = new LinkedHashSet<>();
// Using addAll() method
numbers.addAll(evenNumber);
numbers.add(5);
System.out.println("New LinkedHashSet: " + numbers);
}
}
输出
LinkedHashSet: [2, 4, 6] New LinkedHashSet: [2, 4, 6, 5]
访问LinkedHashSet元素
要访问链式哈希集的元素,我们可以使用iterator()方法。为了使用此方法,我们必须导入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);
// Calling the iterator() method
Iterator<Integer> iterate = numbers.iterator();
System.out.print("LinkedHashSet using Iterator: ");
// Accessing elements
while(iterate.hasNext()) {
System.out.print(iterate.next());
System.out.print(", ");
}
}
}
输出
LinkedHashSet: [2, 5, 6] LinkedHashSet using Iterator: 2, 5, 6,
注意:
hasNext()
如果链式哈希集中有下一个元素,则返回true
next()
返回链式哈希集中的下一个元素
从HashSet删除元素
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);
// Using the remove() method
boolean value1 = numbers.remove(5);
System.out.println("Is 5 removed? " + value1);
boolean value2 = numbers.removeAll(numbers);
System.out.println("Are all elements removed? " + value2);
}
}
输出
LinkedHashSet: [2, 5, 6] Is 5 removed? true Are all elements removed? true
集合运算
LinkedHashSet
类的各种方法也可以用于执行各种集合操作。
集合的并集
要执行两个集合的并集,我们可以使用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);
// Union of two set
numbers.addAll(evenNumbers);
System.out.println("Union is: " + numbers);
}
}
输出
LinkedHashSet1: [2, 4] LinkedHashSet2: [1, 3] Union is: [1, 3, 2, 4]
集合的交集
要执行两个集合的交集,我们可以使用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);
// Intersection of two sets
evenNumbers.retainAll(primeNumbers);
System.out.println("Intersection is: " + evenNumbers);
}
}
输出
LinkedHashSet1: [2, 3] LinkedHashSet2: [2, 4] Intersection is: [2]
集合的差集
要计算两个集合之间的差集,我们可以使用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);
// Difference between LinkedHashSet1 and LinkedHashSet2
primeNumbers.removeAll(oddNumbers);
System.out.println("Difference : " + primeNumbers);
}
}
输出
LinkedHashSet1: [2, 3, 5] LinkedHashSet2: [1, 3, 5] Difference: [2]
子集
要检查一个集合是否是另一个集合的子集,我们可以使用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);
// Check if primeNumbers is a subset of numbers
boolean result = numbers.containsAll(primeNumbers);
System.out.println("Is LinkedHashSet2 is subset of LinkedHashSet1? " + result);
}
}
输出
LinkedHashSet1: [1, 2, 3, 4] LinkedHashSet2: [2, 3] Is LinkedHashSet2 is a subset of LinkedHashSet1? true
LinkedHashSet的其他方法
方法 | 描述 |
---|---|
clone() |
创建LinkedHashSet 的副本 |
contains() |
在LinkedHashSet 中搜索指定元素并返回布尔结果 |
isEmpty() |
检查LinkedHashSet 是否为空 |
size() |
返回LinkedHashSet 的大小 |
clear() |
从LinkedHashSet 中删除所有元素 |
要了解更多关于LinkedHashSet
方法的信息,请访问Java LinkedHashSet(官方Java文档)。
LinkedHashSet 与 HashSet 对比
LinkedHashSet
和HashSet
都实现了Set
接口。但是,它们之间存在一些差异。
LinkedHashSet
在内部维护一个链表。因此,它保持其元素的插入顺序。LinkedHashSet
类比HashSet
需要更多的存储空间。这是因为LinkedHashSet
在内部维护链表。LinkedHashSet
的性能比HashSet
慢。这是因为LinkedHashSet
中存在链表。
LinkedHashSet 与 TreeSet 对比
以下是LinkedHashSet
和TreeSet
之间的主要区别
TreeSet
类实现了SortedSet
接口。因此,树集中的元素是排序的。但是,LinkedHashSet
类仅维护其元素的插入顺序。TreeSet
通常比LinkedHashSet
慢。这是因为每当向TreeSet
添加元素时,它都必须执行排序操作。LinkedHashSet
允许插入null值。但是,我们不能向TreeSet
插入null值。