Java中的ConcurrentSkipListSet及其示例
Java中的 ConcurrentSkipListSet 类是Java集合框架的一部分,实现了 Collection接口 和 AbstractSet类 。它提供了Java中NavigableSet的可扩展且并发版本。ConcurrentSkipListSet的实现基于 ConcurrentSkipListMap 。ConcurrentSkipListSet中的元素默认按其自然排序或由在设置创建时提供的比较器进行排序,具体取决于使用哪种构造函数。
由于它实现了 SortedSet
类层次结构:

声明:
public class ConcurrentSkipListSet<E>
extends AbstractSet<E>
implements NavigableSet<E>, Cloneable, Serializable
其中 **E** 是该集合维护的元素类型
关于ConcurrentSkipListSet的一些重要点:
- 它实现了 Serializable 、 Cloneable 、
Iterable <E>、Collection <E>、NavigableSet <E>、Set <E>和SortedSet <E>接口。 - 它不允许存在空元素,因为无法可靠地区分空参数和返回值与元素的缺失。
- 其实现提供了包含、添加和删除操作及其变体的平均对数(n)时间成本。
- 它是线程安全的。
- 当需要并发修改集时,应优先使用它而不是实现Set接口。
构造函数:
1. ConcurrentSkipListSet() : 该构造函数用于构造一个空集合。
例如:ConcurrentSkipListSet<E> set = new ConcurrentSkipListSet<E>();
2. ConcurrentSkipListSet(Collection
例如:ConcurrentSkipListSet<E> set = new ConcurrentSkipListSet<E>(Collection<E> c);
3. ConcurrentSkipListSet(Comparator
例如:ConcurrentSkipListSet<E> set= new ConcurrentSkipListSet<E>(Comparator<E> comparator);
4. ConcurrentSkipListSet(SortedSet
例如:ConcurrentSkipListSet<E> set = new ConcurrentSkipListSet<E>(SortedSet<E> s);
示例1:
// Java程序演示ConcurrentSkipListSet
import java.util.*;
import java.util.concurrent.ConcurrentSkipListSet;
class ConcurrentSkipListSetLastExample1 {
public static void main(String[] args)
{
//使用ConcurrentSkipListSet()初始化集合
ConcurrentSkipListSet<Integer> set
= new ConcurrentSkipListSet<Integer>();
//将元素添加到集合中
set.add(78);
set.add(64);
set.add(12);
set.add(45);
set.add(8);
//打印ConcurrentSkipListSet
System.out.println("ConcurrentSkipListSet: " + set);
//使用ConcurrentSkipListSet(Collection)初始化集合
ConcurrentSkipListSet<Integer> set1
= new ConcurrentSkipListSet<Integer>(set);
//打印ConcurrentSkipListSet1
System.out.println("ConcurrentSkipListSet1: "
+ set1);
//使用ConcurrentSkipListSet()初始化字串集合
ConcurrentSkipListSet<String> set2
= new ConcurrentSkipListSet<>();
//将元素添加到集合中
set2.add("Apple");
set2.add("Lemon");
set2.add("Banana");
set2.add("Apple");
//创建迭代器
Iterator<String> itr = set2.iterator();
System.out.print("水果集合: ");
while (itr.hasNext()) {
System.out.print(itr.next() + " ");
}
}
}
输出:
ConcurrentSkipListSet: [8, 12, 45, 64, 78]
ConcurrentSkipListSet1: [8, 12, 45, 64, 78]
水果集合: Apple Banana Lemon
示例2:
// Java程序演示ConcurrentSkipListSet
import java.util.concurrent.ConcurrentSkipListSet;
class ConcurrentSkipListSetLastExample1 {
public static void main(String[] args)
{
//使用ConcurrentSkipListSet()初始化集合
ConcurrentSkipListSet<Integer>
set = new ConcurrentSkipListSet<Integer>();
//使用add()方法将元素添加到集合中
set.add(78);
set.add(64);
set.add(12);
set.add(45);
set.add(8);
//打印ConcurrentSkipListSet
System.out.println("ConcurrentSkipListSet: "
+ set);
//打印集合的最高元素
//使用last()方法
System.out.println("集合的最高元素: "
+ set.last());
//检索并删除集合的第一个元素
System.out.println("集合的第一个元素: "
+ set.pollFirst());
//使用contains()方法检查9是否存在于集合中
if (set.contains(9))
System.out.println("9在集合中。");
else
System.out.println("9不在集合中。");
//使用size()方法打印集合的大小
System.out.println("集合中的元素数量 = "
+ set.size());
}
}
输出:
ConcurrentSkipListSet: [8, 12, 45, 64, 78]
集合的最高元素: 78
集合的第一个元素:
8
9不在集合中。
集合中的元素数量 = 4
ConcurrentSkipListSet的方法
| 同步跳表集合中的方法和对应描述: 方法 | 描述 |
|---|---|
| add(E e) | 如果该集合中不包含指定元素,则将指定元素添加到该集合中。 |
| ceiling(E e) | 返回该集合中大于或等于给定元素的最小元素,如果不存在这样的元素则返回 null。 |
| clear() | 从该集合中移除所有元素。 |
| clone() | 返回此 ConcurrentSkipListSet 实例的浅拷贝。 |
| comparator() | 返回用于对该集合中的元素进行排序的比较器,如果该集合使用其元素的自然顺序,则返回 null。 |
| contains(Object o) | 如果该集合中包含指定元素,则返回 true。 |
| descendingIterator() | 以降序迭代器的形式返回该集合中的元素。 |
| descendingSet() | 返回该集合中包含元素的反向视图。 |
| equals(Object o) | 将指定对象与该集合进行比较。 |
| first() | 返回该集合中当前第一个(最低)元素。 |
| floor(E e) | 返回该集合中小于或等于给定元素的最大元素,如果不存在这样的元素则返回 null。 |
| headSet(E toElement) | 返回该集合中元素严格小于 toElement 的部分的视图。 |
| headSet(E toElement, boolean inclusive) | 返回该集合中元素小于(如果 inclusive 为 true,则包括等于)toElement 的部分的视图。 |
| higher(E e) | 返回该集合中严格大于给定元素的最小元素,如果不存在这样的元素则返回 null。 |
| isEmpty() | 如果该集合为空,则返回 true。 |
| last() | 返回该集合中当前最后一个(最高)元素。 |
| lower(E e) | 返回该集合中严格小于给定元素的最大元素,如果不存在这样的元素则返回 null。 |
| pollFirst() | 检索并从该集合中删除第一个(最低)元素或如果该集合为空则返回 null。 |
| pollLast() | 检索并从该集合中删除最后一个(最高)元素或如果该集合为空则返回 null。 |
| remove(Object o) | 如果该集合中存在指定元素,则将其从该集合中删除。 |
| removeAll(Collection> c) | 移除该集合中所有包含在指定 collection 中的元素。 spliterator() | 返回该集合中的元素的 Spliterator。 subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) | 返回该集合中元素范围从 fromElement 到 toElement 的部分的视图,包括 fromElement 和 toElement(如果 fromInclusive 和 toInclusive 均为 true)。 subSet(E fromElement, E toElement) | 返回该集合中元素范围从 fromElement(包括)到 toElement(不包括)的部分的视图。 tailSet(E fromElement) | 返回该集合中大于或等于 fromElement 的部分的视图。 ### java.util.AbstractSet类继承的方法 方法 | 描述 ### java.util.AbstractCollection类继承的方法 方法 | 描述 |
如果此Collection包含指定Collection中的所有元素,则返回true。 |
| retainAll(Collection> c) | 仅保留此Collection中包含在指定Collection中的元素(可选操作)。 toArray() | 返回一个包含此Collection中所有元素的数组。 toArray(T[] a) | 返回一个包含此Collection中所有元素的数组;返回数组的运行时类型与指定数组的类型相同。 toString() | 返回此Collection的字符串表示形式。 ### java.util.Set接口继承的方法 方法 | 描述 |
如果此Set包含指定Collection中的所有元素,则返回true。 |
| hashCode() | 返回此Set的哈希码值。 |
| retainAll(Collection<?> c) | 仅保留此Set中包含在指定Collection中的元素(可选操作)。 |
| toArray() | 返回一个包含此Set中所有元素的数组。 |
| toArray(T[] a) | 返回一个包含此Set中所有元素的数组;返回数组的运行时类型与指定数组的类型相同。 |
java.util.Collection接口继承的方法
| 方法 | 描述 |
|---|---|
| parallelStream() | 返回可能是以此Collection为源的可能并行的Stream。 |
| removeIf(Predicate<? super E> filter) | 删除满足给定谓词的此collection的所有元素。 |
| stream() | 返回以此Collection为源的顺序Stream。 |
java.lang.Iterable接口继承的方法
| 方法 | 描述 |
|---|---|
| forEach(Consumer<? super T> action) | 对Iterable的每个元素执行给定的操作,直到处理完所有元素或该操作引发异常。 |
极客教程