JavaAPI之CopyOnWriteArrayList

结构

java.util.concurrent

类 CopyOnWriteArrayList<E>

java.lang.Object
  java.util.concurrent.CopyOnWriteArrayList<E>
类型参数:
E - 此 collection 中所保存元素的类型
所有已实现的接口:
Serializable, Cloneable, Iterable<E>, Collection<E>, List<E>, RandomAccess

public class CopyOnWriteArrayList<E>
extends Object
implements List<E>, RandomAccess, Cloneable, Serializable

ArrayList 的一个线程安全的变体,其中所有可变操作(add

描述

ArrayList 的一个线程安全的变体,其中所有可变操作(addset 等等)都是通过对底层数组进行一次新的复制来实现的。

这一般需要很大的开销,但是当遍历操作的数量大大超过可变操作的数量时,这种方法可能比其他替代方法 有效。在不能或不想进行同步遍历,但又需要从并发线程中排除冲突时,它也很有用。“快照”风格的迭代器方法在创建迭代器时使用了对数组状态的引用。此数组在迭代器的生存期内不会更改,因此不可能发生冲突,并且迭代器保证不会抛出
ConcurrentModificationException。创建迭代器以后,迭代器就不会反映列表的添加、移除或者更改。在迭代器上进行的元素更改操作(removeset
add)不受支持。这些方法将抛出 UnsupportedOperationException

允许使用所有元素,包括 null

内存一致性效果:当存在其他并发 collection 时,将对象放入 CopyOnWriteArrayList 之前的线程中的操作
happen-before 随后通过另一线程从 CopyOnWriteArrayList 中访问或移除该元素的操作。

此类是 Java Collections Framework 的成员。

从以下版本开始:
1.5
另请参见:
序列化表格

构造方法

1、public CopyOnWriteArrayList()  创建一个空列表。

2、public CopyOnWriteArrayList(Collection<? extends
E> c)

创建一个按 collection 的迭代器返回元素的顺序包含指定 collection 元素的列表。

参数:c - 最初保存元素的 collection

抛出:NullPointerException - 如果指定 collection 为 null

3、public CopyOnWriteArrayList(E[] toCopyIn)   创建一个保存给定数组的副本的列表。

参数:toCopyIn - 数组(将此数组的副本用作内部数组)

抛出:NullPointerException - 如果指定数组为 null

方法详细

1、public int size()  返回此列表中的元素数。

指定者:接口 Collection<E> 中的
size

指定者:接口 List<E> 中的 size

返回:此列表中的元素数

2、public boolean isEmpty()    如果此列表不包含任何元素,则返回
true

指定者:接口 Collection<E> 中的
isEmpty

指定者:接口 List<E> 中的 isEmpty

返回:如果此列表不包含任何元素,则返回 true

3、public boolean
contains(Object o)

如果此列表包含指定的元素,则返回
true。更确切地讲,当且仅当此列表包含至少一个满足
(o==null ? e==null : o.equals(e)) 的元素
e 时,返回
true

指定者:接口
Collection<E> 中的
contains

指定者:接口
List<E> 中的
contains

参数:o - 测试是否存在于此列表中的元素。

返回:如果此列表包含指定元素,则返回
true

4、public int
indexOf(Object o)

返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1。更确切地讲,返回满足
(o==null ? get(i)==null : o.equals(get(i))) 的最低索引
i;如果没有这样的索引,则返回 -1。

指定者:接口
List<E> 中的
indexOf

参数:o - 要搜索的元素

返回:此列表中第一次出现的指定元素的索引,如果列表不包含该元素,则返回 -1

5、public int indexOf(E e, int index)

返回第一次出现的指定元素在此列表中的索引,从 index 开始向前搜索,如果没有找到该元素,则返回 -1。更确切地讲,返回满足 (i >= index && (e==null ? get(i)==null : e.equals(get(i)))) 的最低索引
i,如果不存在这样的索引,则返回 -1。

参数:e - 要搜索的元素   index - 搜索开始处的索引

返回:此列表中 index 或其后的位置上第一次出现该元素的位置索引;如果未找到该元素,则返回
-1

抛出:IndexOutOfBoundsException - 如果指定索引为负

6、public int lastIndexOf(Object o)

返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1。更确切地讲,返回满足 (o==null ? get(i)==null : o.equals(get(i))) 的最高索引
i;如果没有这样的索引,则返回 -1。

指定者:接口 List<E> 中的 lastIndexOf

参数:o - 要搜索的元素

返回:列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1

7、public int lastIndexOf(E e, int index)

返回最后一次出现的指定元素在此列表中的索引,从 index 开始向后搜索,如果没有找到该元素,则返回 -1。更确切地讲,返回满足
(i <= index && (e==null ? get(i)==null : e.equals(get(i))))
的最高索引 i,如果不存在这样的索引,则返回 -1。

参数:e - 要搜索的元素   index - 开始向后搜索处的索引

返回:此列表中小于等于 index 的位置上最后一次出现该元素的位置索引;如果未找到该元素,则返回 -1。

抛出:IndexOutOfBoundsException - 如果指定索引大于等于此列表的当前大小

8、public Object
clone()    返回此列表的浅表副本。(这些元素本身未被复制。)

覆盖:类 Object 中的 clone

返回:此列表的一个副本

另请参见:Cloneable

9、public Object[]
toArray()

返回一个按恰当顺序(从第一个元素到最后一个元素)包含此列表中所有元素的数组。由于此列表并不维护对返回数组的任何引用,因而它将是“安全的”。(换句话说,此方法必须分配一个新数组)。因此,调用者可以随意修改返回的数组。此方法充当基于数组的 API 与基于 collection 的 API 之间的桥梁。

指定者:接口 Collection<E> 中的
toArray

指定者:接口 List<E> 中的 toArray

返回:返回包含此列表所有元素的数组

另请参见:Arrays.asList(Object[])

10、public <T> T[] toArray(T[] a)

返回以恰当顺序(从第一个元素到最后一个元素)包含列表所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。如果指定数组能容纳列表,则则将该队列返回此处。否则,将分配一个具有指定数组的运行时类型和此列表的大小的新数组。如果指定的数组能容纳列表,并有剩余的空间(即数组的元素比列表多),那么会将紧接列表尾部的元素设置为
null。( 当调用者知道此列表不包含任何 null 元素时,才可使用此方法来确定此列表的长度。)像 toArray() 方法一样,此方法充当基于数组的 API 与基于 collection 的 API 之间的桥梁。更进一步说,此方法允许对输出数组的运行时类型进行精确控制,在某些情况下,这可以用来节省分配开销。假定
x 是只包含字符串的一个已知列表。以下代码用来将该列表转储到一个新分配的 String 数组:

String[] y = x.toArray(new String[0]);

注意,toArray(new Object[0])toArray() 在功能上是相同的。

指定者:接口 Collection<E> 中的
toArray

指定者:接口 List<E> 中的 toArray

参数:a - 要存储列表元素的数组(如果该数组足够大);否则,将分配一个具有相同运行时类型的新数组。

返回:包含此列表所有元素的数组

抛出:ArrayStoreException - 如果指定数组的运行时类型不是此列表每个元素的运行时类型的超类型

           NullPointerException - 如果指定数组为 null

11、public E
get(int index)    返回列表中指定位置的元素。

指定者:接口 List<E> 中的 get

参数:index - 要返回的元素的索引

返回:列表中指定位置的元素

抛出:IndexOutOfBoundsException - 如果索引超出范围 (index < 0 || index >= size())

12、public E
set(int index,  E element)    用指定的元素替代此列表指定位置上的元素。

指定者:接口 List<E> 中的 set

参数:index - 要替换的元素的索引   element - 要在指定位置存储的元素

返回:以前在指定位置的元素

抛出:IndexOutOfBoundsException - 如果索引超出范围 (index < 0 || index >= size())

13、public boolean add(E e)    将指定元素添加到此列表的尾部。

指定者:接口 Collection<E> 中的
add

指定者:接口 List<E> 中的 add

参数:e - 要添加到此列表的元素。

返回:true(根据 Collection.add(E) 的规定)

14、public void add(int index, E element)

在此列表的指定位置上插入指定元素。将当前在该位置上的元素(如果有)以及所有后续元素向右移(其索引加 1)。指定者:接口
List<E> 中的 add

参数:index - 要在其中插入指定元素处的索引   element - 要插入的元素

抛出:IndexOutOfBoundsException - 如果索引超出范围 (index < 0 || index > size())

15、public E
remove(int index)   移除此列表指定位置上的元素。将所有后续元素都向左移(其索引减 1)。返回从此列表中移除的元素。

指定者:接口 List<E> 中的 remove

参数:index - 要移除的元素的索引

返回:以前在指定位置的元素

抛出:IndexOutOfBoundsException - 如果索引超出范围 (index < 0 || index >= size())

16、public boolean remove(Object o)

从此列表移除第一次出现的指定元素(如果存在)。 如果列表不包含这样的元素,则不更改列表。更确切地讲,移除具有满足 (o==null ? get(i)==null : o.equals(get(i))) 的最低索引
i 的元素(如果存在这样的元素)。如果此列表包含指定元素(或者此列表由于调用而发生更改),则返回 true

指定者:接口 Collection<E> 中的
remove

指定者:接口 List<E> 中的 remove

参数:o - 要从此列表移除的元素(如果存在)

返回:如果此列表包含指定的元素,则返回 true

17、public boolean
addIfAbsent(E e)
  添加元素(如果不存在)。

参数:e - 要添加到此列表中的元素(如果不存在)

返回:如果已添加该元素,则返回
true

18、public boolean
containsAll(Collection<?> c)
 如果此列表包含指定 collection 的所有元素,则返回
true

指定者:接口
Collection<E> 中的
containsAll

指定者:接口
List<E> 中的
containsAll

参数:c - 将被检查是否包含于此列表的 collection

返回:如果此列表包含指定 collection 的所有元素,则返回
true

抛出:NullPointerException - 如果指定 collection 为 null

另请参见:contains(Object)

19、public boolean removeAll(Collection<?> c)

从此列表移除所有包含在指定 collection 中的元素。在此类中,这是一个开销很大的操作,因为它需要一个内部临时数组。

指定者:接口 Collection<E> 中的
removeAll

指定者:接口 List<E> 中的 removeAll

参数:c - 包含将从此列表中移除的元素的 collection

返回:如果此列表由于调用而发生更改,则返回 true

抛出:ClassCastException - 如果此列表的元素与指定 collection 不兼容(可选)

            NullPointerException - 如果此列表包含一个 null 元素,并且指定 collection 不允许使用 null 元素(可选),或者指定 collection 为 null

另请参见:remove(Object)

20、public boolean retainAll(Collection<?> c)   只保留此列表中包含在指定 collection 中的元素。换句话说,从此列表中移除所有未包含在指定
collection 中的元素。

指定者:接口 Collection<E> 中的
retainAll

指定者:接口 List<E> 中的 retainAll

参数:c - 包含保留在此列表中的元素的 collection

返回:如果此列表由于调用而发生更改,则返回 true

抛出:ClassCastException - 如果此列表的元素的类与指定 collection 不兼容(可选)

            NullPointerException - 如果此列表包含一个 null 元素,并且指定 collection 不允许使用 null 元素(可选),或者指定 collection 为 null

另请参见:remove(Object)

21、public int addAllAbsent(Collection<? extends
E> c)

按照指定 collection 的迭代器返回元素的顺序,将指定 collection 中尚未包含在此列表中的所有元素添加列表的尾部。

参数:c - 包含要添加到此列表中的元素的 collection

返回:添加的元素数量

抛出:NullPointerException - 如果指定 collection 为 null

另请参见:addIfAbsent(Object)

22、public void clear()    从此列表移除所有元素。此调用返回之后,该列表将为空。

指定者:接口 Collection<E> 中的
clear

指定者:接口 List<E> 中的 clear

23、public boolean addAll(Collection<? extends
E> c)   按照指定 collection 的迭代器返回元素的顺序,将指定 collection 中的所有元素添加此列表的尾部。

指定者:接口 Collection<E> 中的
addAll

指定者:接口 List<E> 中的 addAll

参数:c - 包含将插入此列表中的元素的 collection

返回:如果此列表由于调用而发生更改,则返回 true

抛出:NullPointerException - 如果指定 collection 为 null

另请参见:add(Object)

24、public boolean addAll(int index,  Collection<?
extends E> c)

从指定位置开始,将指定 collection 的所有元素插入此列表。将当前在该位置上的元素(如果有)以及所有后续元素都向右移(其索引加 1)。新元素将按指定 collection 的迭代器返回的顺序出现在列表中。

指定者:接口 List<E> 中的 addAll

参数:index - 插入指定 collection 中第一个元素的索引    c - 包含将添加到此列表中的元素的 collection

返回:如果此列表由于调用而发生更改,则返回 true

抛出:NullPointerException - 如果指定的 collection 包含一个或多个 null 元素,并且该列表不允许 null 元素,或者指定的 collection 为 null

            NullPointerException - 如果指定 collection 为 null

另请参见:add(int,Object)

25、public String
toString()

返回此列表的字符串表示形式。该字符串表示形式由列表元素的字符串表示形式组成,这些元素按其迭代器返回的顺序排序,并用方括号 ("[]") 括起来。相邻元素由字符
", "(逗号加空格)分隔。通过 String.valueOf(Object) 可以将元素转换成字符串。

覆盖:类 Object 中的 toString

返回:此列表的字符串表示形式

26、public boolean equals(Object o)

比较指定对象与此列表的相等性。如果指定对象与此对象是同一对象,或者它也是一个 List,并且在指定列表上迭代的迭代器所返回的元素的序列与在此列表上迭代的迭代器所返回的元素序列相同,则返回
true。如果两个序列具有相同的长度,并且对应元素在序列的同一位置上,则认为两个序列是相等的。满足 (e1==null ? e2==null : e1.equals(e2)) 的两个元素
e1e2 视为相等

指定者:接口 Collection<E> 中的
equals

指定者:接口 List<E> 中的 equals

覆盖:类 Object 中的 equals

参数:o - 将与此列表进行相等性比较的对象

返回:如果指定的对象与此列表相等,则返回 true

另请参见:Object.hashCode(),
Hashtable

27、public int hashCode()   返回此列表的哈希码值。 此实现使用了
List.hashCode() 中的定义。

指定者:接口 Collection<E> 中的
hashCode

指定者:接口 List<E> 中的 hashCode

覆盖:类 Object 中的 hashCode

返回:此列表的哈希码值

另请参见:Object.equals(java.lang.Object),
Hashtable

28、public Iterator<E>
iterator()

返回以恰当顺序在此列表元素上进行迭代的迭代器。构造该迭代器时,所返回的迭代器提供了列表状态的一个快照。遍历该迭代器时不需要执行任何同步。该迭代器 支持
remove 方法。

指定者:接口 Iterable<E> 中的
iterator

指定者:接口 Collection<E> 中的
iterator

指定者:接口 List<E> 中的 iterator

返回:以恰当顺序在此列表元素上进行迭代的迭代器

29、public ListIterator<E>
listIterator()   返回此列表元素的列表迭代器(按适当顺序)。在构造该迭代器时,返回的迭代器提供了列表状态的一个快照。遍历该迭代器时不需要执行任何同步。该迭代器 支持
removeset 或者 add 方法。

指定者:接口 List<E> 中的 listIterator

返回:此列表元素的列表迭代器(按适当顺序)

30、public ListIterator<E>
listIterator(int index)

返回列表中元素的列表迭代器(按适当顺序),从列表的指定位置开始。指定的索引表示 next 的初始调用所返回的第一个元素。previous 方法的初始调用将返回索引比指定索引少 1 的元素。

在构造该迭代器时,返回的迭代器提供了列表状态的一个快照。遍历该迭代器时不需要执行任何同步。该迭代器 支持 removeset 或者
add 方法。

指定者:接口 List<E> 中的 listIterator

参数:index - 从列表迭代器返回的第一个元素的索引(通过调用
next 方法)

返回:此列表中元素的列表迭代器(按适当顺序),从列表中的指定位置开始

抛出:IndexOutOfBoundsException - 如果索引超出范围 (index < 0 || index > size())

31、public List<E>
subList(int fromIndex, int toIndex)

返回此列表中 fromIndex(包括)和 toIndex(不包括)之间部分的视图。返回的列表受此列表的支持,因此返回列表中的更改将反映在此列表中,反之亦然。当支持可变操作时,它们对于 CopyOnWriteArrayLists 可能不是很有用。如果通过返回列表以外的其他任何方式从结构上修改 底层实现列表(即此列表),则此方法返回的列表语义将是不确定的。(从结构上修改是指更改列表的大小,或者以其他方式打乱列表,使正在进行的迭代生成错误的结果。)

指定者:接口 List<E> 中的 subList

参数:fromIndex - subList 的低端点(包括)  toIndex - subList 的高端点(不包括)

返回:此列表中指定范围的视图

抛出:IndexOutOfBoundsException - 非法的端点值 (fromIndex < 0 || toIndex > size || fromIndex > toIndex)

时间: 2024-11-05 13:48:14

JavaAPI之CopyOnWriteArrayList的相关文章

elasticsearch的javaAPI之index

Index API 原文:http://www.elasticsearch.org/guide/en/elasticsearch/client/java-api/current/index_.html index API允许你将JSON document转换为一个特定的index,使它便于搜索操作. 生成JSON文档: 有几种不同的方法生成一个JSON document: 手动使用 byte[] 或String 使用一个map来等效转换为JSON 使用第三方库来将beans装换(如Jackson

elasticsearch的javaAPI之query

elasticsearch的javaAPI之query API the Search API允许执行一个搜索查询,返回一个与查询匹配的结果(hits). 它可以在跨一个或多个index上执行, 或者一个或多个types. 查询可以使用提供的 query Java API 或filter Java API . 搜索请求的主体是建立使用 SearchSourceBuilder上. 这里有一个例子: import org.elasticsearch.action.search.SearchRespon

J.U.C并发框架源码阅读(十五)CopyOnWriteArrayList

基于版本jdk1.7.0_80 java.util.concurrent.CopyOnWriteArrayList 代码如下 /* * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * * * * * * * * * * * * * * * * * * *

Java并发编程:并发容器之CopyOnWriteArrayList

原文链接: http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW,是一种用于程序设计中的优化策略.其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略.从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet.CopyOnW

熟练掌握HDFS的Shell访问和JavaAPI访问

HDFS设计的主要目的是对海量数据进行处理,也就是说在其上能够储存很大量文件(可以储存TB级的文件).HDFS将这些文件分割之后,储存在不同的DataNode上,HDFS提供了两种数据访问接口:Shell接口和javaAPI接口,对HDFS里面的文件进行操作. Shell接口  HDFS处理文件的命令和linux命令基本相同,这里区分大小写.下面介绍HDFS操作分布式文件系统的命令. HDFS基本命令 hadoop fs -cmd  其中cmd:具体的操作,基本上与unix的命令相同 args:

图解集合3:CopyOnWriteArrayList

初识CopyOnWriteArrayList 第一次见到CopyOnWriteArrayList,是在研究JDBC的时候,每一个数据库的Driver都是维护在一个CopyOnWriteArrayList中的,为了证明这一点,贴两段代码,第一段在com.mysql.jdbc.Driver下,也就是我们写Class.forName("...")中的内容: public class Driver extends NonRegisteringDriver implements java.sql

Kafka-2.11学习笔记(三)JavaApi访问kafka

欢迎访问:鲁春利的工作笔记,学习是一种信仰,让时间考验坚持的力量. Kafka底层是基于Scala语言实现的,但是也提供了Java的API接口. Java实现的消息生产者 package com.lucl.kafka.simple; import java.util.Properties; import kafka.javaapi.producer.Producer; import kafka.producer.KeyedMessage; import kafka.producer.Produc

读CopyOnWriteArrayList有感

除了加锁外,其实还有一种方式可以防止并发修改异常,这就是将读写分离技术(不是数据库上的). 先回顾一下一个常识: 1.JAVA中“=”操作只是将引用和某个对象关联,假如同时有一个线程将引用指向另外一个对象,一个线程获取这个引用指向的对象,那么他们之间不会发生ConcurrentModificationException,他们是在虚拟机层面阻塞的,而且速度非常快,几乎不需要CPU时间. 2.JAVA中两个不同的引用指向同一个对象,当第一个引用指向另外一个对象时,第二个引用还将保持原来的对象. 基于

CopyOnWriteArrayList

CopyOnWriteArrayList类最大的特点就是,在对其实例进行修改操作(add/remove等)会新建一个数据并修改,修改完毕之后,再将原来的引用指向新的数组.这样,修改过程没有修改原来的数组.也就没有了ConcurrentModificationException错误. 从上面的结果很容易就看出来,hashcode变化了多次,说明了list已经不是原来的list对象了.这说明了CopyOnWriteArrayList类的add函数在执行的时候确实是修改了list的数组对象. add函