目录
ArrayLIst简介
ArrayList就是动态数组,就是数组的复杂版本,相比于数组,它提供了动态的增加和减少元素。不过也有一些缺点,使用get和set方法实现访问或改变数组元素的草走,而不能使用[]愈发格式
ArrayList API
ArrayList<T>():默认构造函数,构造一个空数组列表
ArrayList<T>(int initialCapacity):用指定容量构造一个空数组列表
bollean add(T obj):在数组列表的尾端添加一个元素。永远返回true
int size():返回存储在数组列表中的当前元素数量。(这个值将小于或等于数组列表的容量,这个值就是数组实际存储的元素的个数,而不是capacity)
void ensureCapacity(int capacity):确保数组列表在不重新分配存储空间的情况下就能保存给定数量的元素。简单来说,就是在使用数组钱,能够估计出来数组可能存储的元素数量,那么我们就可以提前为数组分配好空间大小。
void trimToSize():将数组列表的存储容量消减到当前size大小的尺寸。一般当你确定当前数组不会再添加任何元素的时候调用。
E set (int index,T obj): 返回数组索引为index的值,并设置数组索引为index的新值为obj。
void T get(int index):返回数组索引为index的值。
T get(int index):获得指定元素的位置(必须介于0~sie()-1之间)
T remove(int index):删除一个元素,并将后面的元素向前移动。被删除的元素由返回值返回。
这里只是列举了一些常用的方法,全部方法也并没有列出,本文主要介绍为什么使用add方法为数组添加新元素,而不使用set方法。
为什么使用add方法添加新元素而不使用set方法添加?
这里其实是我当时的一个纠结点,我在想,既然array空间都给我分配好了,我直接set值为什么不可以?直到我看了源码之后,才发现两个函数根本就不是一个东西,添加新元素只能有add,不能用set
这里就直接放set方法的源码了。
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
...
private void rangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
public E set(int index, E element) {
rangeCheck(index);
E oldValue = elementData(index);
elementData[index] = element;
return oldValue;
}
...
其实,我觉得当我贴出源码之后,都不需要解释了~~
反正,通过代码再解释一遍,当ArrayList没有存放任何内容时,size值是为0的,使用set方法自热会抛异常,亦或者从我们的set方法来说,调用set方法,会返回原来未初始化的旧值,程序也会出错。
所以使用add方法添加新元素而不使用set方法。