public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
ArrayList继承AbstractList,实现List,RandomAccess(支持快速随机访问),Cloneable(可克隆的),Serializable(可序列化的)
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E>
AbstractList继承AbstractCollection,实现List
public abstract class AbstractCollection<E> implements Collection<E>
AbstractCollection实现Collection
public interface List<E> extends Collection<E>
List继承Collection
public interface Collection<E> extends Iterable<E>
Collection继承Iterable
ArrayList底层是Object[]实现的,数组的值可重复,可为null,线程不安全
默认容量10,当进行add操作时,先判断Object[]是否有足够空间存放添加的值,发现不够时,扩容至1.5倍。
newCapacity = oldCapacity + (oldCapacity>>1);
1、添加数据
使用set方法添加值时,先判断下标是否越界。将原来下标上的值替换成新值,把旧值返回。
2、获取数据:使用get方法获取值时,先判断下标是否越界。
3、删除数据
一、通过下标删除remove(int index)
先判断下标是否越界,将下标index的数据删除,index后面的数据通过System.ArrayCopy方法往前移动。返回删除的值
size=elementData.length()
numMove=size-(index+1);//index后面的数据
System.ArrayCopy(elementData,index+1,elementData,index,numMove)
然后将Object[] elementData 最后一位赋值null,elementData[--size]=null;
二、通过值删除remove(object obj)
判断obj是否为null,遍历集合,找出值为obj的下标index
为null:elementData[index]==null;不为null:obj.equals(elementData[index])
满足这个条件,删除对应下标inde的值。
在集合中删除了数据obj返回true,未删除返回false。
modCount++:fail-fast机制。
集合大小size发生改变时会进行modCount++操作(修改次数)
modCount在本数据结构对应迭代器中使用,在迭代器初始的时候记录用这个迭代器的对象的modCount,在迭代器遍历过程中如果发现对象的modCount发生变化,则抛出异常,fail-fast机制。
一些集合不是线程安全的,假如在迭代的过程有其他线程修改了该集合对象的大小size,抛异常。
subList
subList()截取elementData中一个范围的数据,操作截取后的集合,原集合会跟着改变。
ArrayList类中有subList内部类
private class SubList extends AbstractList<E> implements RandomAccess {
private final AbstractList<E> parent;
private final int parentOffset;
private final int offset;
int size;
SubList(AbstractList<E> parent,
int offset, int fromIndex, int toIndex) {
this.parent = parent;
this.parentOffset = fromIndex;
this.offset = offset + fromIndex;
this.size = toIndex - fromIndex;
this.modCount = ArrayList.this.modCount;
}
集合对象elementData调用subList()会生成subList内部类对象。
subList类没有定义Object[]来存放对象,定义变量parent(指向原集合地址)来保存传递的原集合
定义一个偏移量offset来保存偏移量,当对subList对象修改时,通过偏移量offset找到在变量parent对应的位置,修改的变量parent中的数据
定义size表示在集合parent中subList的可见范围是多少