Java HashSet add() 方法
add()
方法是 HashSet
类中最常用的方法之一,它的作用是将一个元素添加到集合中。
方法语法
public boolean add(E e)
参数说明
E e
:要添加到集合中的元素
返回值
- 如果集合中不包含该元素,则添加成功,返回
true
- 如果集合中已经包含该元素,则不会添加,返回
false
基本示例
实例
import java.util.HashSet;
public class HashSetExample {
public static void main(String[] args) {
// 创建一个 HashSet
HashSet<String> fruits = new HashSet<>();
// 添加元素
boolean isAdded1 = fruits.add("Apple"); // 返回 true
boolean isAdded2 = fruits.add("Banana"); // 返回 true
boolean isAdded3 = fruits.add("Apple"); // 返回 false,因为 Apple 已存在
System.out.println(fruits); // 输出: [Apple, Banana]
System.out.println("第一次添加 Apple: " + isAdded1);
System.out.println("第一次添加 Banana: " + isAdded2);
System.out.println("第二次添加 Apple: " + isAdded3);
}
}
public class HashSetExample {
public static void main(String[] args) {
// 创建一个 HashSet
HashSet<String> fruits = new HashSet<>();
// 添加元素
boolean isAdded1 = fruits.add("Apple"); // 返回 true
boolean isAdded2 = fruits.add("Banana"); // 返回 true
boolean isAdded3 = fruits.add("Apple"); // 返回 false,因为 Apple 已存在
System.out.println(fruits); // 输出: [Apple, Banana]
System.out.println("第一次添加 Apple: " + isAdded1);
System.out.println("第一次添加 Banana: " + isAdded2);
System.out.println("第二次添加 Apple: " + isAdded3);
}
}
add() 方法的底层原理
理解 add()
方法的工作原理有助于我们更好地使用 HashSet
。
添加元素的流程
- 计算哈希值:首先计算要添加元素的
hashCode()
- 确定存储位置:根据哈希值确定元素在哈希表中的存储位置
- 检查是否已存在:
- 如果该位置为空,直接存储元素
- 如果该位置不为空,则调用
equals()
方法比较元素是否相同
- 决定是否添加:
- 如果元素相同,则不添加,返回
false
- 如果元素不同(哈希冲突),则可能存储在同一个桶(bucket)的不同位置
- 如果元素相同,则不添加,返回
重要注意事项
HashSet
依赖元素的hashCode()
和equals()
方法- 如果要存储自定义对象,必须正确重写这两个方法
- 不正确的实现可能导致集合行为异常
add() 方法的时间复杂度
HashSet
的 add()
方法在理想情况下(没有哈希冲突)的时间复杂度是 **O(1)**。这意味着无论集合中有多少元素,添加一个新元素的时间大致相同。
然而,在极端情况下(所有元素都哈希到同一个位置),时间复杂度会退化到 **O(n)**,因为需要遍历链表或红黑树来检查元素是否已存在。
add() 方法的实际应用
示例1:去重
实例
import java.util.HashSet;
public class DeduplicationExample {
public static void main(String[] args) {
String[] names = {"Alice", "Bob", "Alice", "Charlie", "Bob"};
HashSet<String> uniqueNames = new HashSet<>();
for (String name : names) {
uniqueNames.add(name);
}
System.out.println(uniqueNames); // 输出: [Alice, Bob, Charlie]
}
}
public class DeduplicationExample {
public static void main(String[] args) {
String[] names = {"Alice", "Bob", "Alice", "Charlie", "Bob"};
HashSet<String> uniqueNames = new HashSet<>();
for (String name : names) {
uniqueNames.add(name);
}
System.out.println(uniqueNames); // 输出: [Alice, Bob, Charlie]
}
}
示例2:统计唯一元素数量
实例
import java.util.HashSet;
public class UniqueCounter {
public static void main(String[] args) {
int[] numbers = {1, 2, 3, 2, 4, 1, 5};
HashSet<Integer> uniqueNumbers = new HashSet<>();
for (int num : numbers) {
uniqueNumbers.add(num);
}
System.out.println("唯一元素数量: " + uniqueNumbers.size()); // 输出: 5
}
}
public class UniqueCounter {
public static void main(String[] args) {
int[] numbers = {1, 2, 3, 2, 4, 1, 5};
HashSet<Integer> uniqueNumbers = new HashSet<>();
for (int num : numbers) {
uniqueNumbers.add(num);
}
System.out.println("唯一元素数量: " + uniqueNumbers.size()); // 输出: 5
}
}
常见问题解答
1. 为什么添加重复元素时 add() 方法返回 false?
因为 HashSet
的设计原则是不允许重复元素。当尝试添加一个已经存在的元素时,集合不会改变,方法返回 false
来表示添加操作没有实际发生。
2. 如何判断两个元素是否"相同"?
HashSet
使用以下规则判断两个元素是否相同:
- 首先比较
hashCode()
返回值 - 如果哈希值相同,再调用
equals()
方法比较
只有当两个元素的 hashCode()
相同且 equals()
返回 true
时,才认为是相同元素。
3. 可以添加 null 值吗?
是的,HashSet
允许添加 null
值,但只能添加一次(因为集合不允许重复)。
实例
HashSet<String> set = new HashSet<>();
set.add(null); // 返回 true
set.add(null); // 返回 false
set.add(null); // 返回 true
set.add(null); // 返回 false
总结
HashSet
的add()
方法用于向集合中添加元素- 如果元素已存在,则不会添加并返回
false
- 该方法的时间复杂度在理想情况下是 O(1)
- 正确使用
HashSet
需要理解hashCode()
和equals()
方法的作用 HashSet
非常适合需要快速查找和去重的场景
通过掌握 add()
方法的使用和原理,你可以更有效地利用 HashSet
来解决各种编程问题。
点我分享笔记