说明:
1:ArrayList 其实就是可自动扩容的数组
2:ArrayList 每次扩容会预申请多一点空间(1.5倍+1) 最大容量是 Integer.MAX_VALUE - 8
3:ArrayList 实现了RandomAccess 提供了随机访问功能
1:继承关系:
2:比较重要的类成员
private static final int DEFAULT_CAPACITY = 10; private static final 修饰的成员变量 该变量代表ArrayList 默认的初始大小是10
private static final Object[] EMPTY_ELEMENTDATA = {}; 代表arrayList 没有任何元素
private transient Object[] elementData; 用于存储ArrayList 的元素 这里用上了transient 关键字 表明是常变的
private int size; arrayList 长度
3:构造方法
ArrayList 总共有3个构造方法
1: public ArrayList() 构造含有10个容量的空list
2: public ArrayList(int initialCapacity) 构造含有指定容量的空list 如果参数小于0 则会抛出异常 就是说这里是可以设置等于0 的。但貌似也没有任何意义。
3: public ArrayList(Collection<? extends E> c) 构造包含指定集合长度的非空 list。 如果c 为null 会产生空指针异常
4:深入了解的一些方法
1: public void trimToSize() 修剪ArrayList 到当前元素大小的长度 如容量是150 实际元素是100 那么将去除掉50的容量 感觉平时很少用上
2: public void ensureCapacity(int minCapacity) 保障容量 参数超过当前容量则会扩容
3: public boolean contains(Object o) 判断是否包含某元素 实际上内部调用的 indexOf() 方法
4: 添加方法 有2种添加方式
1: public boolean add(E e) 添加元素到数组末尾 会自动扩容 第一次添加元素的容量是10
public void add(int index, E element) 添加元素到指定位置 同样会扩容 如果超过数组长度 则会抛出异常
主要的实现是调用 System.arraycopy 该方法是System类中的一个JNI方式实现类.(JNI , Java Native Interface 故名思意,就是java 语言调其它语言的一个接口)
详细介绍为: public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
src:源数组; srcPos:源数组要复制的起始位置;
dest:目的数组; destPos:目的数组放置的起始位置;
length:复制的长度.
举个列子: 假设现有数组 {1,2,3,4,5} 现在需要添加元素 {0} 到索引 2 中 .那么执行完arraycopy 方法后 结果应该是 {1,2,3,3,4,5}
2: public boolean addAll(Collection<? extends E> c) 将指定集合的元素添加到列表最后 采用 addAll 的方式会比for 循环添加有效率
public boolean addAll(int index, Collection<? extends E> c) 添加到指定位置 类似上述add 方法
4: 删除方法 总共有2种(删除都不会减少容量大小)
1:public E remove(int index) 删除指定位置元素
public boolean remove(Object o) 删除指定元素 效率比较慢 需要循环比较
2: public boolean removeAll(Collection<?> c) 删除指定列表内的所有元素
5:遍历访问