线程安全的 HashSet - ConcurrentHashSet
# 线程安全的 HashSet - ConcurrentHashSet
简介
在 JDK 中,虽然有线程安全的 ConcurrentHashMap
,但没有提供对应的线程安全的 HashSet
。Hutool 利用 ConcurrentHashMap
封装了一个线程安全的 ConcurrentHashSet
,它具有和 HashSet
一样的 API 和使用方式,但在多线程环境下更加安全,适用于并发操作场景。
# 1. 使用场景
ConcurrentHashSet
非常适合在多线程环境中使用,比如在 Web 应用或多线程任务中,需要同时向一个集合中添加元素的情况下,它能够确保线程安全。同时,它在高并发场景下有较好的性能表现。
# 2. 主要方法
# 2.1 构造方法
创建一个空的线程安全 ConcurrentHashSet
,支持默认构造和使用指定初始容量的构造方式。
ConcurrentHashSet()
:使用默认初始容量构造一个空的ConcurrentHashSet
。ConcurrentHashSet(int initialCapacity)
:使用指定的初始容量构造一个空的ConcurrentHashSet
。
# 示例:创建线程安全的 ConcurrentHashSet
import cn.hutool.core.collection.ConcurrentHashSet;
import java.util.Set;
public class ConcurrentHashSetExample {
public static void main(String[] args) {
// 使用默认构造方法创建
Set<String> set = new ConcurrentHashSet<>();
// 使用指定初始容量创建
Set<String> customSet = new ConcurrentHashSet<>(100);
// 打印集合信息
System.out.println("默认构造方法创建的集合: " + set);
System.out.println("指定初始容量创建的集合: " + customSet);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- 参数说明:
initialCapacity
: 指定集合的初始容量。
- 作用:初始化一个线程安全的集合,可以根据预估的元素数量指定合适的初始容量,以提高性能。
- 实际开发场景:在多线程应用中,需要存储大量数据时,通常需要指定初始容量以优化性能。
# 2.2 添加元素
通过 add
方法可以将元素添加到集合中,该方法在多线程环境下是安全的。
# 示例:在多线程环境中添加元素
import cn.hutool.core.collection.ConcurrentHashSet;
import java.util.Set;
public class ConcurrentHashSetExample {
public static void main(String[] args) {
// 创建一个线程安全的集合
Set<String> set = new ConcurrentHashSet<>();
// 创建多个线程同时向集合中添加元素
Thread thread1 = new Thread(() -> {
set.add("a");
set.add("b");
});
Thread thread2 = new Thread(() -> {
set.add("c");
set.add("d");
});
// 启动线程
thread1.start();
thread2.start();
// 等待线程完成
try {
thread1.join();
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
// 打印集合中的元素
System.out.println("集合中的元素: " + set);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
- 方法签名:
boolean add(E e)
- 参数说明:
e
: 需要添加到集合中的元素。
- 返回值:
boolean
,返回true
表示元素成功添加,false
表示元素已存在。 - 作用:将元素添加到线程安全的集合中,确保多线程环境下的一致性。
- 实际开发场景:在多线程任务中,需要同时向集合中添加元素时,可以使用此方法。
# 2.3 移除元素
通过 remove
方法可以安全地从集合中移除指定元素。
# 示例:移除集合中的元素
import cn.hutool.core.collection.ConcurrentHashSet;
import java.util.Set;
public class ConcurrentHashSetExample {
public static void main(String[] args) {
// 创建一个线程安全的集合
Set<String> set = new ConcurrentHashSet<>();
set.add("a");
set.add("b");
set.add("c");
// 移除元素 "b"
boolean removed = set.remove("b");
// 打印移除结果和集合内容
System.out.println("元素 'b' 是否移除成功: " + removed);
System.out.println("集合中的元素: " + set);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- 方法签名:
boolean remove(Object o)
- 参数说明:
o
: 需要从集合中移除的元素。
- 返回值:
boolean
,返回true
表示元素成功移除,false
表示元素不存在。 - 作用:在多线程环境中安全地移除集合中的元素。
- 实际开发场景:在多线程任务中,需要动态调整集合内容时,可以使用此方法。
# 2.4 检查元素是否存在
通过 contains
方法可以检查指定元素是否存在于集合中。
# 示例:检查元素是否存在
import cn.hutool.core.collection.ConcurrentHashSet;
import java.util.Set;
public class ConcurrentHashSetExample {
public static void main(String[] args) {
// 创建一个线程安全的集合
Set<String> set = new ConcurrentHashSet<>();
set.add("a");
set.add("b");
// 检查元素是否存在
boolean containsA = set.contains("a");
boolean containsC = set.contains("c");
// 打印检查结果
System.out.println("集合是否包含 'a': " + containsA); // true
System.out.println("集合是否包含 'c': " + containsC); // false
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- 方法签名:
boolean contains(Object o)
- 参数说明:
o
: 需要检查的元素。
- 返回值:
boolean
,返回true
表示元素存在,false
表示元素不存在。 - 作用:在多线程环境中快速检查集合中是否包含某个元素。
- 实际开发场景:在处理黑名单、缓存等需要快速查询的场景中,可以使用此方法。
# 3. 实际应用场景
- 多线程共享数据结构:在多线程环境下,需要使用一个线程安全的集合来共享数据。
- 实时动态调整集合内容:在多任务应用中,随着任务的进行,可能需要动态添加或移除集合中的元素。
- 高并发场景下的唯一性判断:在需要确保数据唯一性的场景中,
ConcurrentHashSet
是一个高效的选择。
编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08