ArrayLIst
集合存在于Java.Util包路径下
-
重复性
可以存放重复的数值 -
null值
可以有null值存在 -
有序性
可以保证元素插入有序 -
底层数据结构
ArrayList集合底层元素保存在数组中
源码研究
继承关系
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
- ArrayList继承AbstractList,父类中对部分接口进行实现
- 实现了List接口提供的方法
- Serializable说明集合可以被序列化
基本属性及默认值
private static final int DEFAULT_CAPACITY = 10;//默认容量大小
private static final Object[] EMPTY_ELEMENTDATA = {};//默认数组大小
private transient Object[] elementData; //存储元素的数组
private int size;//集合存储元素的个数
构造函数
- 有参构造,指定集合初始化大小
public ArrayList( int initialCapacity){
super();
if (initialCapacity < 0)//指定大小不合法,抛出异常
throw new IllegalArgumentException("Illegal Capacity: " +
initialCapacity);
this.elementData = new Object[initialCapacity];
}
- 无参构造
public ArrayList() {
super();
this.elementData = EMPTY_ELEMENTDATA;//给定的默认数组
}
- 有参构造,通过集合来创建新的集合
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
size = elementData.length;
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
}
增长方式
1.5倍扩容
//minCapacity数值为size+1
private void grow(int minCapacity) {
//记录旧的数组大小
int oldCapacity = elementData.length;
//新数组长度为旧数组的1.5倍
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
常用方法
- int size() 集合中存储元素的个数
- boolean isEmpty() 判断集合是否为空,返回值为boolean值
- boolean contains(Object o) 判断当前集合是否包含Object对象
- T[] toArray(T[] a) 将集合转化为数组
- boolean addAll(Collection<? extends E> c) 对该集合添加子集形成新的集合
- boolean addAll(int index, Collection<? extends E> c) 在指定位置对该集合添加子集形成新的集合
- boolean add(E e) 添加元素
public boolean add(E e) {
/**
*首先进行扩容考虑,如果size + 1 > elementData.length,需要扩容
*将元素存放在数组的size位,并对其+1
*/
ensureCapacityInternal(size + 1); // 扩容
elementData[size++] = e;
return true;
}
- void clear() 将集合清除掉
- int indexOf(Object o) 判断元素在集合中的位置(从前向后找)
- int lastIndexOf(Object o) 判断元素在集合中的位置,从尾部向前找
- List subList(int fromIndex, int toIndex) 找当前集合的子集(给定位置,例如0-3)