Java:HashSet的使用
目录
一、概念
二、常用操作
三、与其他Set比较
一、概念
HashSet
是 Java 集合框架 (java.util
包) 中的一个类,它实现了 Set
接口。
核心特点:
-
Set 接口的核心特性:一个不包含重复元素的集合。更正式地说,Set 不包含满足
e1.equals(e2)
的元素对e1
和e2
,并且最多允许一个 null 元素。 -
基于哈希表:
HashSet
的背后实现依赖于一个哈希表(具体来说是HashMap
实例)。这是它所有特性的根源。 -
无序性:它不保证元素的迭代顺序;特别是,它不保证顺序会随时间保持不变。
-
非线程安全:
HashSet
不是线程安全的。如果多个线程同时访问一个HashSet
,并且至少有一个线程修改了它,则必须在外部进行同步。通常使用Collections.synchronizedSet
来包装它:
Set<String> synchronizedSet = Collections.synchronizedSet(new HashSet<String>());
二、常用操作
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;public class HashSetDemo {public static void main(String[] args) {// 1. 创建HashSetSet<String> programmingLanguages = new HashSet<>();// 2. 添加元素programmingLanguages.add("Java");programmingLanguages.add("Python");programmingLanguages.add("C++");programmingLanguages.add("JavaScript");programmingLanguages.add("Java"); // 重复元素,不会被添加programmingLanguages.add(null); // 添加一个null值System.out.println(programmingLanguages); // 输出可能是:[null, Java, C++, JavaScript, Python] // 顺序是不确定的,并且可能与JVM版本有关。// 3. 检查元素是否存在boolean hasJava = programmingLanguages.contains("Java"); // trueboolean hasGo = programmingLanguages.contains("Go"); // false// 4. 移除元素programmingLanguages.remove("C++");System.out.println("After removing C++: " + programmingLanguages);// 5. 获取大小System.out.println("Size: " + programmingLanguages.size()); // 4// 6. 迭代HashSet (多种方式)// 方式一:使用增强for循环(推荐)System.out.println("=== Enhanced for loop ===");for (String language : programmingLanguages) {System.out.println(language);}// 方式二:使用IteratorSystem.out.println("=== Iterator ===");Iterator<String> iterator = programmingLanguages.iterator();while (iterator.hasNext()) {String language = iterator.next();System.out.println(language);// 可以在迭代中使用 iterator.remove() 安全地删除当前元素}// 方式三:Java 8 forEach + LambdaSystem.out.println("=== forEach Lambda ===");programmingLanguages.forEach(language -> System.out.println(language));// 或者使用方法引用// programmingLanguages.forEach(System.out::println);// 7. 清空集合programmingLanguages.clear();System.out.println("Is set empty? " + programmingLanguages.isEmpty()); // true}
}
三、与其他Set比较
特性 | HashSet | LinkedHashSet | TreeSet |
---|---|---|---|
内部实现 | HashMap | LinkedHashMap | TreeMap (红黑树) |
元素顺序 | 无顺序 | 插入顺序 或 访问顺序 (LRU) | 自然顺序 或 定制排序 |
null 元素 | 允许一个 null | 允许一个 null | 不允许 (如果使用自然排序) |
性能 (add, remove, contains) | O(1) (平均情况) | 略低于 HashSet,但仍是 O(1) | O(log n) |
使用场景 | 最通用的Set,需要快速查找、去重 | 需要保持插入顺序的Set | 需要元素自动排序的Set |