CopyOnWriteArrayList的使用.docx
《CopyOnWriteArrayList的使用.docx》由会员分享,可在线阅读,更多相关《CopyOnWriteArrayList的使用.docx(15页珍藏版)》请在冰豆网上搜索。
CopyOnWriteArrayList的使用
java.util.concurrent
类CopyOnWriteArraySet
java.lang.Object
java.util.AbstractCollection
java.util.AbstractSet
java.util.concurrent.CopyOnWriteArraySet
类型参数:
E -此collection中所保存元素的类型
所有已实现的接口:
Serializable, Iterable, Collection, Set
publicclassCopyOnWriteArraySet
extends
AbstractSet
implements
Serializable
对其所有操作使用内部 CopyOnWriteArrayList 的 Set。
因此,它共享以下相同的基本属性:
∙它最适合于具有以下特征的应用程序:
set大小通常保持很小,只读操作远多于可变操作,需要在遍历期间防止线程间的冲突。
∙它是线程安全的。
∙因为通常需要复制整个基础数组,所以可变操作(add、set 和 remove 等等)的开销很大。
∙迭代器不支持可变 remove 操作。
∙使用迭代器进行遍历的速度很快,并且不会与其他线程发生冲突。
在构造迭代器时,迭代器依赖于不变的数组快照。
示例用法。
以下代码使用一个写时复制(copy-on-write)的set,以维护在状态更新时执行某项操作的一组Handler对象。
classHandler{voidhandle();...}
classX{
privatefinalCopyOnWriteArraySethandlers=newCopyOnWriteArraySet();
publicvoidaddHandler(Handlerh){handlers.add(h);}
privatelonginternalState;
privatesynchronizedvoidchangeState(){internalState=...;}
publicvoidupdate(){
changeState();
for(Handlerhandler:
handlers)
handler.handle();
}
}
此类是 JavaCollectionsFramework 的成员。
从以下版本开始:
1.5
另请参见:
CopyOnWriteArrayList, 序列化表格
构造方法摘要
CopyOnWriteArraySet()
创建一个空set。
CopyOnWriteArraySet(Collection
extends E> c)
创建一个包含指定collection所有元素的set。
方法摘要
boolean
add(E e)
如果指定元素并不存在于此set中,则添加它。
boolean
addAll(Collection
extends E> c)
如果此set中没有指定collection中的所有元素,则将它们都添加到此set中。
void
clear()
移除此set中的所有元素。
boolean
contains(Object o)
如果此set包含指定元素,则返回 true。
boolean
containsAll(Collection
> c)
如果此set包含指定collection的所有元素,则返回 true。
boolean
equals(Object o)
比较指定对象与此set的相等性。
boolean
isEmpty()
如果此set不包含任何元素,则返回 true。
Iterator
iterator()
返回按照元素添加顺序在此set中包含的元素上进行迭代的迭代器。
boolean
remove(Object o)
如果指定元素存在于此set中,则将其移除。
boolean
removeAll(Collection
> c)
移除此set中包含在指定collection中的所有元素。
boolean
retainAll(Collection
> c)
仅保留此set中那些包含在指定collection中的元素。
int
size()
返回此set中的元素数目。
Object[]
toArray()
返回一个包含此set所有元素的数组。
T[]
toArray(T[] a)
返回一个包含此set所有元素的数组;返回数组的运行时类型是指定数组的类型。
从类java.util.AbstractSet 继承的方法
hashCode
从类java.util.AbstractCollection 继承的方法
toString
从类java.lang.Object 继承的方法
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
构造方法详细信息
CopyOnWriteArraySet
publicCopyOnWriteArraySet()
创建一个空set。
CopyOnWriteArraySet
publicCopyOnWriteArraySet(Collection
extendsE> c)
创建一个包含指定collection所有元素的set。
参数:
c -最初包含元素的collection
抛出:
NullPointerException -如果指定collection为null
方法详细信息
size
publicintsize()
返回此set中的元素数目。
指定者:
接口 Collection 中的 size
指定者:
接口 Set 中的 size
指定者:
类 AbstractCollection 中的 size
返回:
此set中的元素数
isEmpty
publicbooleanisEmpty()
如果此set不包含任何元素,则返回 true。
指定者:
接口 Collection 中的 isEmpty
指定者:
接口 Set 中的 isEmpty
覆盖:
类 AbstractCollection 中的 isEmpty
返回:
如果此set不包含任何元素,则返回 true
contains
publicbooleancontains(Object o)
如果此set包含指定元素,则返回 true。
更确切地讲,当且仅当此set包含满足 (o==null?
e==null:
o.equals(e)) 的元素 e 时,返回 true。
指定者:
接口 Collection 中的 contains
指定者:
接口 Set 中的 contains
覆盖:
类 AbstractCollection 中的 contains
参数:
o -将测试其是否存在于此set中的元素
返回:
如果此set包含指定元素,则返回 true
toArray
publicObject[]toArray()
返回一个包含此set所有元素的数组。
如果此set对其迭代器返回的元素的顺序做出了某些保证,那么此方法必须以相同的顺序返回这些元素。
不维护对返回数组的任何引用,因而它将是“安全的”。
(换句话说,即使set受到数组的支持,此方法也必须分配一个新的数组)。
因此,调用这可以随意修改返回的数组。
此方法充当基于数组的API与基于collection的API之间的桥梁。
指定者:
接口 Collection 中的 toArray
指定者:
接口 Set 中的 toArray
覆盖:
类 AbstractCollection 中的 toArray
返回:
包含此set所有元素的数组
toArray
publicT[]toArray(T[] a)
返回一个包含此set所有元素的数组;返回数组的运行时类型是指定数组的类型。
如果指定的数组能容纳该set,则将set返回此处。
否则,将分配一个具有指定数组的运行时类型和此set大小的新数组。
如果指定的数组能容纳set,并有剩余的空间(即数组的元素比set多),那么会将接set尾部的元素设置为 null。
(仅 当调用者知道此set不包含任何null元素时,才可使用此方法来确定此set的长度。
)
如果此set对其迭代器返回的元素顺序做出了某些保证,那么此方法必须以相同的顺序返回这些元素。
像 toArray() 方法一样,此方法充当基于数组的API与基于collection的API之间的桥梁。
更进一步说,此方法允许对输出数组的运行时类型进行精确控制,在某些情况下,可以用来节省分配开销。
假定 x 是只包含字符串的一个已知set。
以下代码用来将该set转储到一个新分配的 String 数组:
String[]y=x.toArray(newString[0]);
注意, toArray(newObject[0]) 和 toArray() 在功能上是相同的。
指定者:
接口 Collection 中的 toArray
指定者:
接口 Set 中的 toArray
覆盖:
类 AbstractCollection 中的 toArray
参数:
存储此 -set元素的数组(如果该数组足够大);否则为此分配一个具有相同运行时类型的新数组
返回:
包含此set所有元素的数组
抛出:
ArrayStoreException -如果指定数组的运行时类型不是此set每个元素的运行时类型的超类型
NullPointerException -如果指定数组为null
clear
publicvoidclear()
移除此set中的所有元素。
在此调用返回之后,set将为空。
指定者:
接口 Collection 中的 clear
指定者:
接口 Set 中的 clear
覆盖:
类 AbstractCollection 中的 clear
remove
publicbooleanremove(Object o)
如果指定元素存在于此set中,则将其移除。
更确切地讲,如果此set中包含满足 (o==null?
e==null:
o.equals(e)) 的元素 e,则移除它。
如果此set包含指定元素(或者此set由于调用而发生更改),则返回 true。
(调用返回后,则此set便不再包含这样的元素。
)
指定者:
接口 Collection 中的 remove
指定者:
接口 Set 中的 remove
覆盖:
类 AbstractCollection 中的 remove
参数:
o -要从此set移除的对象(如果存在)
返回:
如果此set包含指定元素,则返回 true
add
publicbooleanadd(E e)
如果指定元素并不存在于此set中,则添加它。
更确切地讲,如果此set不包含满足 (e==null?
e2==null:
e.equals(e2)) 的元素 e2,则将指定元素 e 添加到此set中。
如果此set已经包含这样的元素,则该调用不改变此set并返回 false。
指定者:
接口 Collection 中的 add
指定者:
接口 Set 中的 add
覆盖:
类 AbstractCollection 中的 add
参数:
e -要添加到此set的元素
返回:
如果此set并未包含指定元素,则返回 true
containsAll
publicbooleancontainsAll(Collection
> c)
如果此set包含指定collection的所有元素,则返回 true。
如果指定的collection也是一个set,那么当该collection是此set的 子集 时,此方法返回 true。
指定者:
接口 Collection 中的 containsAll
指定者:
接口 Set 中的 containsAll
覆盖:
类 AbstractCollection 中的 containsAll
参数:
c -将被检查是否存在于此set的collection
返回:
如果此set包含指定collection的所有元素,则返回 true
抛出:
NullPointerException -如果指定collection为null
另请参见:
contains(Object)
addAll
publicbooleanaddAll(Collection
extendsE> c)
如果此set中没有指定collection中的所有元素,则将它们都添加到此set中。
如果指定的collection也是一个set,则 addAll 操作会实际修改此set,从而它的值是两个set的一个 并集。
如果指定collection在操作过程中被修改,则此操作的行为是不确定的。
指定者:
接口 Collection 中的 addAll
指定者:
接口 Set 中的 addAll
覆盖:
类 AbstractCollection 中的 addAll
参数:
c -包含将添加到此set中的元素的collection
返回:
如果此set由于调用而发生更改,则返回 true
抛出:
NullPointerException -如果指定collection为null
另请参见:
add(Object)
removeAll
publicbooleanremoveAll(Collection
> c)
移除此set中包含在指定collection中的所有元素。
如果指定的collection也是一个set,则此操作会实际修改此set,从而其值是两个set的一个 不对称差集。
指定者:
接口 Collection 中的 removeAll
指定者:
接口 Set 中的 removeAll
覆盖:
类 AbstractSet 中的 removeAll
参数:
c -包含将从此set中移除的元素的collection
返回:
如果此set由于调用而发生更改,则返回 true
抛出:
ClassCastException -如果此set的元素的类与指定collection不兼容(可选)
NullPointerException -如果此set包含一个null元素并且指定collection不允许使用null元素(可选),或者指定collection为null
另请参见:
remove(Object)
retainAll
publicbooleanretainAll(Collection
> c)
仅保留此set中那些包含在指定collection中的元素。
换句话说,移除此set中所有未包含在指定collection中的元素。
如果指定的collection也是一个set,则此操作会实际修改此set,这样其值是两个set的一个 交集。
指定者:
接口 Collection 中的 retainAll
指定者:
接口 Set 中的 retainAll
覆盖:
类 AbstractCollection 中的 retainAll
参数:
c -包含保留在此set中的元素的collection
返回:
如果此set由于调用而发生更改,则返回 true
抛出:
ClassCastException -如果此set的元素的类与指定collection不兼容(可选)
NullPointerException -如果此set包含一个null元素并且指定collection不允许使用null元素(可选),或者指定collection为null
另请参见:
remove(Object)
iterator
publicIteratoriterator()
返回按照元素添加顺序在此set中包含的元素上进行迭代的迭代器。
在构造迭代器时,返回的迭代器提供该set的状态的快照。
在遍历迭代器时无需同步。
该迭代器不 支持 remove 方法。
指定者:
接口 Iterable 中的 iterator
指定者:
接口 Collection 中的 iterator
指定者:
接口 Set 中的 iterator
指定者:
类 AbstractCollection 中的 iterator
返回:
在此set中的元素上进行迭代的迭代器
equals
publicbooleanequals(Object o)
比较指定对象与此set的相等性。
如果指定对象与此对象是同一对象,则返回 true,如果它也是一个 Set 并且在指定set上迭代的 迭代器所返回的元素序列与在此set上进行迭代迭代器所返回的元素的序列相同。
更确切地讲,如果两个迭代器返回相同的元素数,并且对于在指定set上进行迭代的迭代器返回的每个元素 e1 而言,都有一个由在此set上进行迭代的迭代器返回的元素 e2,且该元素满足 (e1==null?
e2==null:
e1.equals(e2)),则认为两个迭代器将返回相同的元素。
指定者:
接口 Collection 中的 equals
指定者:
接口 Set 中的 equals
覆盖:
类 AbstractSet 中的 equals
参数:
o -将与此set进行相等性比较的对象
返回:
如果指定的对象与此set相等,则返回 true
另请参见:
Object.hashCode(), Hashtable