ArrayList常用方法
方法名 | 方法说明 |
---|---|
public boolean add(E e) | 将指定的元素追加到此集合的末尾 |
public boolean add(index E element) | 在此集合中的指定位置插入指定的元素 |
public void clear() | 从列表中删除所有元素 |
public boolean remove(Object o) | 从列表中删除指定元素的第一个出现(如果存在),并且返回值是否成功 |
public E remove(int index) | 删除该列表中指定位置的元素,返回!被!删除的元素(注意是指定位置的元素) |
public E set(int index, E element) | 用指定的元素替换此列表中指定位置的元素,返回被替换的元素 |
public E get(int index) | 返回此列表中指定位置的元素 |
public int size() | 返回集合中的元素的个数------相当于数组以及字符串的length方法 |
package Com;
import java.util.ArrayList;
public class Demon1 {
public static void main(String[] args){
ArrayList<String> e = new ArrayList<>();
e.add("程");//0
e.add("序");//1
e.add("猿");//2
System.out.println("此时删除结果true和false是:"+e.remove("猿"));//利用public boolean remove(Object o)方法
System.out.println("此时被删除指定位置的元素是:"+e.remove(1));//利用public E remove(index)方法
System.out.println("修改第0个元素结果为:"+e.set(0,"翔"));//利用public E set(int index, E element)方法
System.out.println("此时长度是:"+e.size());//利用public int size()方法
System.out.println("最后用索引得到的元素是:"+e.get(0));//利用public E get(int index)方法
System.out.println("最终结果输出是:"+e);
}
}
ArrayList源码分析
ArrayList底层维护的是一个动态数组
,每个ArrayList实例都有一个容量。该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向 ArrayList 中不断添加元素,其容量也自动增长ArrayList不是同步的(也就是说不是线程安全的)
,如果多个线程同时访问一个ArrayList实例,而其中至少一个线程从结构上修改了列表,那么它必须保持外部同步,在多线程环境下,可以使用Collections.synchronizedList方法声明一个线程安全的ArrayList,例如:
List arraylist = Collections.synchronizedList(new ArrayList());
- 下面通过ArrayList的源码来分析其原理。
源码分析1:
- ArrayList的构造方法: ArrayList提供了三种不同的构造方法:
- ArrayList(),构造一个初始容量为 10 的空列表。
- ArrayList(int initialCapacity),构造一个具有指定初始容量的空列表。
- ArrayList(Collection<? extends E> c),构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的。
- 当采用不带参数的构造方法ArrayList()生成一个集合对象时,其实是在底层调ArrayList(intinitialCapacity)这一构造方法生产一个长度为10的Object类型的数组。
- 当采用带有集合类型参数的构造方法时,在底层生成一个包含相同的元素和长度的Object类型的数组。
源码分析2:
- add方法:
ArrayList提供了两种添加元素的add方法
- add(E e),将指定的元素添加到此列表的尾部。
- add(int index, E e),将指定的元素插入此列表中的指定位置。向右移动当前位于该位置的元素(如果有)以及所有后续元素(将其索引加 1)private int size;
- 如果集合中添加的元素
超过了10个
,那么ArrayList底层会新生成一个数组
,长度为原数组的1.5倍+1
,并将原数组中的元素copy到新数组中,并且后续添加的元素都会放在新数组中,当新数组的长度无 法容纳新添加的元素时,重复该过程。这就是集合添加元素的实现原理。
源码分析3
- get(int index),返回此列表中指定位置上的元素。
源码分析4
- remove方法:
- E remove(int index),移除此列表中指定位置上的元素。向左移动所有后续元素(将其索引减1)。
- boolean remove(Object o),移除此列表中首次出现的指定元素(如果存在)。如果列表不包含此元素,则列表不做改动,返回boolean值。
源码分析5
- Object clone(),返回此ArrayList实例的浅表副本(不复制这些元素本身)
以上通过对ArrayList部分关键源码的分析,知道了ArrayList底层的实现原理,关于ArrayList源码有以下几点几点总结:
- ArrayList 底层是基于数组来实现的,可以通过下标准确的找到目标元素,因此查找的效率高;但是添加或删除元素会涉及到大量元素的位置移动,效率低。
- ArrayList提供了三种不同的构造方法,无参数的构造方法默认在底层生成一个长度为10的Object类型的数组,当集合中添加的元素个数大于10,数组会自动进行扩容,即生成一个新的数组,并将原数组的元素放到新数组中。
- ensureCapacity方法对数组进行扩容,它会生成一个新数组,长度是原数组的
1.5倍+1
,随着向ArrayList中不断添加元素,当数组长度无法满足需要时,重复该过程。