第一章 java 基础 - 03集合专栏(02_ArrayList)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_39923324/article/details/81982532

无意间都到一篇《走心的安卓工程师跳槽经验分享》,发现自己工作几年了,技术方面虽然有了飞跃的进步,可是不知道自己的技术到了什么地步,每个方面我都涉及到了,但都不深,这大概是初级工程师的诟病吧!

即使知道也不知道从何下手,非常感谢《走心的安卓工程师跳槽经验分享》的作者!

感兴趣的朋友和我一起走下去吧!

03集合专栏(02_ArrayList)

Class ArrayList《E》

java.lang.Object
java.util.AbstractCollection
java.util.AbstractList
java.util.ArrayList
所有已实现的接口
Serializable, Cloneable, Iterable, Collection, List, RandomAccess
直接已知子类::
AttributeList, RoleList, RoleUnresolvedList

public class ArrayList<E> extends AbstractList<E> 
    implements List<E>, RandomAccess, Cloneable, Serializable{
}

List接口的可调整大小的数组实现。实现所有可选列表操作,并允许所有元素,包括null。除了实现List接口之外,此类还提供了一些方法来操作内部用于存储列表的数组的大小。 (这个类大致相当于Vector,除了它是不同步的。)
size,isEmpty,get,set,iterator和listIterator操作以恒定时间运行。添加操作以分摊的常量时间运行,即添加n个元素需要O(n)时间。所有其他操作都以线性时间运行(粗略地说)。与LinkedList实现相比,常数因子较低。

每个ArrayList实例都有一个容量。容量是用于存储列表中元素的数组的大小。它始终列表大小一样大。随着元素添加到ArrayList,其容量会自动增加。除了添加元素具有恒定的摊销时间成本这一事实之外,未指定增长策略的详细信息。

在使用ensureCapacity操作添加大量元素之前,应用程序可以增加ArrayList实例的容量。这可能会减少增量重新分配的数量。

请注意,此实现不同步。如果多个线程同时访问ArrayList实例,并且至少有一个线程在结构上修改了列表,则必须在外部进行同步。 (结构修改是添加或删除一个或多个元素的任何操作,或显式调整后备数组的大小;仅设置元素的值不是结构修改。)这通常通过同步一些自然封装的对象来实现。名单。如果不存在此类对象,则应使用Collections.synchronizedList方法“包装”该列表。这最好在创建时完成,以防止意外地不同步访问列表:

List list = Collections.synchronizedList(new ArrayList(…));
这个类的iterator和listIterator方法返回的迭代器是快速失败的:如果在创建迭代器之后的任何时候对列表进行结构修改,除了通过迭代器自己的remove或add方法之外,迭代器将抛出ConcurrentModificationException。因此,在并发修改的情况下,迭代器快速而干净地失败,而不是在未来的未确定时间冒任意,非确定性行为的风险。

请注意,迭代器的快速失败行为无法得到保证,因为一般来说,在存在不同步的并发修改时,不可能做出任何硬性保证。失败快速迭代器会尽最大努力抛出ConcurrentModificationException。因此,编写依赖于此异常的程序以确保其正确性是错误的:迭代器的快速失败行为应该仅用于检测错误。

此类是Java Collections Framework的成员。

如果在创建迭代器之后的任何时候对列表进行结构修改,除了通过迭代器自己的remove或add方法之外,迭代器将抛出ConcurrentModificationException,如果在遍历中修改集合,只能使用迭代器的remove()或add方法

   public void remove(){
        List<String> dataList=new ArrayList<String>();
        dataList.add("苹果");
        dataList.add("香蕉");
        dataList.add("橘子");
        Iterator iterator = dataList.iterator();
        while (iterator.hasNext()) {
            String s= (String) iterator.next();
            if (s.equals("苹果")) {
                iterator.remove();
            }
        }
    }      

构造函数详细信息

public ArrayList(int initialCapacity)
构造具有指定初始容量的空列表。
参数:
initialCapacity - 列表的初始容量
抛出:
IllegalArgumentException - 如果指定的初始容量为负数

public ArrayList()
构造一个初始容量为10的空列表。

public ArrayList(Collection <?extends E> c)
按照集合的迭代器返回的顺序构造一个包含指定集合元素的列表。
参数:
c - 要将其元素放入此列表的集合
抛出:
NullPointerException - 如果指定的集合为null

方法:

public void trimToSize()
将此ArrayList实例的容量调整为列表的当前大小。应用程序可以使用此操作来最小化ArrayList实例的存储。

public void ensureCapacity(int minCapacity)
如有必要,增加此ArrayList实例的容量,以确保它至少可以容纳由最小容量参数指定的元素数。
参数:
minCapacity - 所需的最小容量

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

public boolean contains(Object o)
如果此列表包含指定的元素,则返回true。更正式地,当且仅当此列表包含至少一个元素e时才返回true(o == null?e == null:o.equals(e))。
参数:
o - 要测试其在此列表中的存在的元素
返回:
如果此列表包含指定的元素,则返回true

public int indexOf(Object o)
返回此列表中第一次出现的指定元素的索引,如果此列表不包含该元素,则返回-1。更正式地,返回最低索引i,使得(o == null?get(i)== null:o.equals(get(i))),如果没有这样的索引则返回-1。
参数:
o - 要搜索的元素
返回:
此列表中第一次出现的指定元素的索引,如果此列表不包含该元素,则返回-1

public int lastIndexOf(Object o)
返回此列表中指定元素最后一次出现的索引,如果此列表不包含该元素,则返回-1。更正式地,返回最高索引i,使得(o == null?get(i)== null:o.equals(get(i))),如果没有这样的索引则返回-1。
参数:
o - 要搜索的元素
返回:
此列表中指定元素最后一次出现的索引,如果此列表不包含该元素,则返回-1

public Object clone()
返回此ArrayList实例的浅表副本。 (元素本身不会被复制。)

public Object [] toArray()
以适当的顺序(从第一个元素到最后一个元素)返回包含此列表中所有元素的数组。
返回的数组将是“安全的”,因为此列表不会保留对它的引用。 (换句话说,此方法必须分配一个新数组)。因此调用者可以自由修改返回的数组。
此方法充当基于阵列和基于集合的API之间的桥梁。
返回:
一个数组,以适当的顺序包含此列表中的所有元素
也可以看看:
Arrays.asList(对象[])

public T [] toArray(T [] a)
以适当的顺序返回包含此列表中所有元素的数组(从第一个元素到最后一个元素);返回数组的运行时类型是指定数组的运行时类型。如果列表适合指定的数组,则返回其中。否则,将为新数组分配指定数组的运行时类型和此列表的大小。
如果列表适合指定的数组,并且有空余空间(即,数组的元素多于列表),则紧跟集合结尾的数组中的元素将设置为null。 (仅当调用者知道列表不包含任何null元素时,这在确定列表长度时很有用。)
在AbstractCollection类中的toArray
类型参数:
T - 包含集合的数组的运行时类型
参数:
a - 列表元素要存储到的数组,如果它足够大;否则,为此目的分配相同运行时类型的新数组。
返回:
包含列表元素的数组
抛出:
ArrayStoreException - 如果指定数组的运行时类型不是此列表中每个元素的运行时类型的超类型
NullPointerException - 如果指定的数组为null

public E get(int index)
返回此列表中指定位置的元素。
参数:
index - 要返回的元素的索引
返回:
此列表中指定位置的元素
抛出:
IndexOutOfBoundsException - 如果索引超出范围(索引<0 || index> = size())

**public E set(int index,
E element )**
用指定的元素替换此列表中指定位置的元素。
参数:
index - 要替换​​的元素的索引
element - 要存储在指定位置的元素
返回:
先前在指定位置的元素
抛出:
IndexOutOfBoundsException - 如果索引超出范围(索引<0 || index> = size())

public boolean add(E e)
将指定的元素追加到此列表的末尾。
具体说明:
添加接口Collection
具体说明:
在接口List 中添加
覆盖:
在类AbstractList 中添加
参数:
e - 要附加到此列表的元素
返回:
true(由Collection.add(E)指定)

**public void add(int index,
E element)**
将指定元素插入此列表中的指定位置。将当前位于该位置的元素(如果有)和任何后续元素移位到右侧(将其添加到其索引中)。
参数:
index - 要插入指定元素的索引
element - 要插入的元素
抛出:
IndexOutOfBoundsException - 如果索引超出范围(索引<0 || index> size())

public E remove(int index)
删除此列表中指定位置的元素。将任何后续元素向左移位(从索引中减去一个元素)。
参数:
index - 要删除的元素的索引
返回:
从列表中删除的元素
抛出:
IndexOutOfBoundsException - 如果索引超出范围(索引<0 || index> = size())

public boolean remove(Object o)
从该列表中删除指定元素的第一个匹配项(如果存在)。如果列表不包含该元素,则不会更改。更正式地,删除具有最低索引i的元素,使得(o == null?get(i)== null:o.equals(get(i)))(如果存在这样的元素)。如果此列表包含指定的元素,则返回true(或等效地,如果此列表因调用而更改)。
参数:
o - 要从此列表中删除的元素(如果存在)
返回:
如果此列表包含指定的元素,则返回true

public void clear()
从此列表中删除所有元素。此调用返回后,列表将为空。
具体说明:
在接口Collection 中清除

public boolean addAll(Collection <?extends E> c)
将指定集合中的所有元素按指定集合的​​Iterator返回的顺序附加到此列表的末尾。如果在操作正在进行时修改了指定的集合,则此操作的行为是不确定的。 (这意味着如果指定的集合是此列表,则此调用的行为是未定义的,并且此列表是非空的。)
参数:
c - 包含要添加到此列表的元素的集合
返回:
如果此列表因调用而更改,则为true
抛出:
NullPointerException - 如果指定的集合为null
也可以看看:
AbstractCollection.add(对象)

**public boolean addAll(int index,
Collection

list.subList(fromto).clear();

可以为indexOf(Object)和lastIndexOf(Object)构造类似的习语,Collections类中的所有算法都可以应用于subList。
如果支持列表(即,此列表)在结构上以除了返回列表之外的任何方式进行修改,则此方法返回的列表的语义将变为未定义。 (结构修改是那些改变了这个列表的大小,或以其他方式扰乱它的方式,正在进行的迭代可能会产生不正确的结果。)
参数:
fromIndex - subList的低端点(包括)
toIndex - subList的高端点(独占)
返回:
此列表中指定范围的视图
抛出:
IndexOutOfBoundsException - 如果端点索引值超出范围(fromIndex <0 || toIndex> size)
IllegalArgumentException - 如果端点索引乱序(fromIndex> toIndex)

public void forEach(Consumer <?super E> action)
从界面复制的描述:Iterable
对Iterable的每个元素执行给定的操作,直到处理完所有元素或操作抛出异常为止。除非实现类另有指定,否则操作按迭代顺序执行(如果指定了迭代顺序)。操作抛出的异常将转发给调用者。
参数:
action - 要为每个元素执行的操作

public Spliterator spliterator()
在此列表中的元素上创建后期绑定和失败快速的Spliterator。
Spliterator报告Spliterator.SIZED,Spliterator.SUBSIZED和Spliterator.ORDERED。覆盖实现应记录其他特征值的报告。
返回:
Spliterator对此列表中的元素

public boolean removeIf(Predicate <?super E> filter)
从interface:Collection复制的描述
删除此集合中满足给定谓词的所有元素。在迭代期间或通过谓词抛出的错误或运行时异常被中继到调用者。
参数:
filter - 一个谓词,对于要删除的元素返回true
返回:
如果删除了任何元素,则为true

public void replaceAll(UnaryOperator operator)
从interface:List复制的描述
将该列表的每个元素替换为将运算符应用于该元素的结果。操作员抛出的错误或运行时异常将转发给调用者。
参数:
operator - 要应用于每个元素的运算符

public void sort(Comparator<?super E> c)
从interface:List复制的描述
根据指定的比较器引发的顺序对此列表进行排序。
此列表中的所有元素必须使用指定的比较器进行相互比较(即,c.compare(e1,e2)不得对列表中的任何元素e1和e2抛出ClassCastException)。

如果指定的比较器为null,则此列表中的所有元素都必须实现Comparable接口,并且应使用元素的自然顺序。

此列表必须是可修改的,但无需调整大小。

具体说明:
在接口List 中排序
参数:
c - 用于比较列表元素的比较器。空值表示应使用元素的自然顺序

猜你喜欢

转载自blog.csdn.net/weixin_39923324/article/details/81982532