标签:private lazy mini get rgba 随机 ++ nal 否则
1.ArrayList继承AbstractList,该类的父类AbstractCollection实现了Collection接口。
2.RandomAccess:是一个标识,其内部无任何定义,表名该类支持随机访问。
3.Cloneable:能被克隆,实现了clone()方法,浅拷贝。
4.Serializable:支持序列化,能通过序列化去传输。
1.成员变量
//默认初始容量大小 private static final int DEFAULT_CAPACITY = 10; //共享空数组 private static final Object[] EMPTY_ELEMENTDATA = {}; //有初始容量的共享空数组 private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; //保存数据的数组 transient Object[] elementData; //元素个数 private int size;
2.构造器
//参数为集合的长度 public ArrayList(int initialCapacity) { //参数校验 if (initialCapacity > 0) { this.elementData = new Object[initialCapacity]; } else if (initialCapacity == 0) { //长度为0,创建空数组 this.elementData = EMPTY_ELEMENTDATA; } else { throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); } } //无参构造器 public ArrayList() { //创建有初始容量的空数组 this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; } //参数为Collection或其子类对象 public ArrayList(Collection<? extends E> c) { //将集合转为数组 elementData = c.toArray(); if ((size = elementData.length) != 0) { //判断数组的类型是否为Object if (elementData.getClass() != Object[].class) //若不是Object将其转为Object类型 elementData = Arrays.copyOf(elementData, size, Object[].class); } else { //若集合长度为0,创建空数组 this.elementData = EMPTY_ELEMENTDATA; } }
3.主要方法
//该方法将数组长度改为集合中存在元素数量 public void trimToSize() { modCount++; //若当前元素数量小于数组长度:为0则创建空数组,为其他值将数组长度压缩为当前集合中元素的数量。 if (size < elementData.length) { elementData = (size == 0) ? EMPTY_ELEMENTDATA : Arrays.copyOf(elementData, size); } }
扩容机制,以添加单个元素为例
public boolean add(E e) { modCount++; //调用私有方法添加元素 add(e, elementData, size); return true; } private void add(E e, Object[] elementData, int s) { //若当前元素数量已经与集合长度相同,就进行扩容,调用grow() if (s == elementData.length) elementData = grow(); elementData[s] = e; size = s + 1; } private Object[] grow() { return grow(size + 1); } private Object[] grow(int minCapacity) { int oldCapacity = elementData.length; if (oldCapacity > 0 || elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { //minCatacity为假若成功添加后元素数量,oldCapacity为当前集合长度,若minCapacity - oldCapacity < oldCapacity >> 1 ,newCapacity = oldCapacity >> 1 + oldCapacity,也就是1.5倍。否则newCapacity = minCapacity + oldCapacity int newCapacity = ArraysSupport.newLength(oldCapacity, minCapacity - oldCapacity, /* minimum growth */ oldCapacity >> 1 /* preferred growth */); return elementData = Arrays.copyOf(elementData, newCapacity); } else { //若数组为空,执行下述代码 return elementData = new Object[Math.max(DEFAULT_CAPACITY, minCapacity)]; } }
int size():返回集合中元素的数量
boolean isEmpty():判断集合是否为空
boolean contains(Object o):判断集合是否包含指定元素
int indexOf(Object o):返回集合中首次出现元素o的索引
int lastIndexOf(Object o):返回集合中最后一次出现元素o的索引
Object[] toArray():将结合转为Object类型数组
<T> T[] toArray(T[] a):将集合转为指定类型数组
E get(int index):返回指定索引处元素
E set(int index, E element):用指定元素替换指定索引处的元素
boolean add(E e):在末尾添加元素
void add(int index, E element):在指定位置处添加元素
E remove(int index):移除指定索引处元素并返回该元素
boolean remove(Object o):移除指定元素
void removeRange(int fromIndex, int toIndex):移除指定索引范围内元素,左闭右开
void clear():清除集合中的所有元素
boolean addAll(Collection<? extends E> c):将指定集合添加至该集合的尾部
最后:向 ArrayList 添加大量元素之前最好先使用ensureCapacity
方法,以减少增量重新分配的次数。
标签:private lazy mini get rgba 随机 ++ nal 否则
原文地址:https://www.cnblogs.com/3w9898/p/14407880.html