Java 中的 copy onwriterarrayset
原文:https://www.geeksforgeeks.org/copyonwritearrayset-in-java/
copy onwriterarrayset是 Java 集合框架的成员。这是一个使用内部副本写数组列表进行所有操作的集合。它是在 JDK 1.5 中引入的,我们可以说它是 Set 的线程安全版本。要使用这个类,我们需要从 java.util.concurrent 包导入它。
共享 Set 的一些属性,也有自己的属性:
- CopyOnWriteArraySet 的内部实现仅为copy onwriterarraylist。
- 多个线程能够同时执行更新操作,但是对于每个更新操作,会创建一个单独的克隆副本。每次更新都会创建一个新的克隆副本,这是很昂贵的。因此,如果需要多次更新操作,则不建议使用 CopyOnWriteArraySet。
- 当一个线程迭代集合时,其他线程可以执行更新,这里我们不会得到任何运行时异常,比如ConcurrentModificationException。****
- CopyOnWriteArraySet 类的迭代器只能执行只读,不应该执行删除,否则我们会得到运行时异常UnsupportedOperationException。****
- 在集合大小通常保持较小的应用程序中使用 CopyOnWriteArraySet,只读操作大大超过了变异操作,并且您需要在遍历过程中防止线程之间的干扰。
- CopyOnWriteArraySet 有助于最大限度地减少程序员控制的同步步骤,并将控制转移到内置的、经过良好测试的 API。
*阶级等级:*
java.lang.Object
↳ java.util.AbstractCollection<E>
↳ java.util.AbstractSet<E>
↳ java.util.concurrent.CopyOnWriteArraySet<E>
*申报:*
public class CopyOnWriteArraySet<E> extends AbstractSet<E> implements Serializable
这里, E 是存储在此集合中的元素类型。实现可序列化、可迭代< E > 、集合< E > 、设置< E > 接口。
*施工人员:*
*1。copy onwriterarrayset()*:创建一个空集合。
copy onwriterarraysetc = new copy onwriterarrayset();
*2。CopyOnWriteArraySet(集合 c)* :创建包含指定集合的所有元素的集合。
copy onwriterarraysetc =新的 copy onwriterarrayset(集合 c);
*例:*
Java 语言(一种计算机语言,尤用于创建网站)
// Java program to illustrate
// CopyOnWriteArraySet class
import java.util.concurrent.*;
import java.util.*;
public class ConcurrentDemo extends Thread {
static CopyOnWriteArraySet l = new CopyOnWriteArraySet();
public void run()
{
// Child thread trying to add
// new element in the Set object
l.add("D");
}
public static void main(String[] args)
{
// add elements using add method
l.add("A");
l.add("B");
l.add("C");
// We create a child thread
// that is going to modify
// CopyOnWriteArraySet l.
ConcurrentDemo t = new ConcurrentDemo();
// run the child thread
t.start();
// Wait for the thread to
// add the element.
try {
Thread.sleep(2000);
}
catch (InterruptedException e) {
System.out.println("child going to add element");
}
System.out.println(l);
// Now we iterate through the
// CopyOnWriteArraySet and we
// wont get exception.
Iterator itr = l.iterator();
while (itr.hasNext())
{
String s = (String)itr.next();
System.out.println(s);
if(s.equals("C"))
{
// Here we will get
// RuntimeException
itr.remove();
}
}
}
}
*输出:*
[A, B, C, D]
A
B
C
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.concurrent.CopyOnWriteArrayList$COWIterator.remove(CopyOnWriteArrayList.java:1176)
at ConcurrentDemo.main(ConcurrentDemo.java:56)
*迭代 copy onwriterarrayset:*我们可以使用迭代器()方法,按照添加元素的顺序迭代这个集合中包含的元素。返回的迭代器提供了构造迭代器时集合状态的不可变快照。由于这个属性, GeeksforGeeks 在第一次迭代时不会被打印。迭代时不需要同步。迭代器不支持 remove 方法。
Java 语言(一种计算机语言,尤用于创建网站)
// Java program to illustrate
// Iterating over CopyOnWriteArraySet class
import java.io.*;
import java.util.*;
import java.util.concurrent.*;
class IteratingCopyOnWriteArraySet {
public static void main(String[] args)
{
// create an instance of
// CopyOnWriteArraySet
CopyOnWriteArraySet<String> set
= new CopyOnWriteArraySet<>();
// Initial Iterator
Iterator itr = set.iterator();
// add elements using add() method
set.add("GeeksforGeeks");
// print the contents
// of set to the console
System.out.println("Set contains: ");
while (itr.hasNext())
System.out.println(itr.next());
// iterator after adding an element
itr = set.iterator();
// print the elements to the console
System.out.println("Set contains:");
while (itr.hasNext())
System.out.println(itr.next());
}
}
**Output:
java
Set contains:
Set contains:
GeeksforGeeks
**
CopyOnWriteArraySet 中的方法
- *E*–元素类型
从 java.util.AbstractSet 类继承的方法
| 方法 | 描述 | | --- | --- | | [hashCode()](https://www.geeksforgeeks.org/abstractset-hashcode-method-in-java-with-examples/) | 返回该集合的哈希代码值。 |从 java.util.AbstractCollection 类继承的方法
| 方法 | 描述 | | --- | --- | | [toString()](https://www.geeksforgeeks.org/abstractset-tostring-method-in-java-with-example/) | 返回此集合的字符串表示形式。 |从接口 java.util.Collection 继承的方法
| 方法 | 描述 | | --- | --- | | 并行流() | 以此集合为源返回一个可能并行的流。 | | 流() | 返回以此集合为源的顺序流。 |HashSet 与 CopyOnWriteArraySet
| 财产 | 哈希集 | copy onwriterarrayset | | --- | --- | --- | | *包装* | 属于 **java.util** 包 | 属于 **java.util.concurrent** 包 | | *同步* | 同步意味着只有一个线程可以访问或修改它。HashSet 未同步。 | 它是同步的。 | | *迭代器* | 迭代器返回我的方法[迭代器()](https://www.geeksforgeeks.org/hashset-iterator-method-in-java/)和列表迭代器()是[快速失败](https://www.geeksforgeeks.org/fail-fast-fail-safe-iterators-java/)。 | 返回的迭代器是[故障安全](https://www.geeksforgeeks.org/fail-fast-fail-safe-iterators-java/)。 | | *在版本*中增加 | 它是在 JDK 1.2 中添加的 | 它是在 JDK 1.5 中添加的 | | *性能* | 因为不同步,所以速度很快。 | 因为是同步的,所以它比 HashSet 慢。 | | 例外 | 它可能会抛出**ConcurrentModificationException**,因为许多线程可以同时访问它。 | 它不会抛出**ConcurrentModificationException**,因为它是同步的。 |版权属于:月萌API www.moonapi.com,转载请注明出处