ArrayList

ArrayList 类是一个可以动态修改的数组,与普通数组的区别是它没有固定大小的限制,可以添加或删除元素。
ArrayList 类位于 java.util 包中,使用前需要引入(import java.util.ArrayList;)

ArrayList初始化方式
ArrayList<数据类型> 对象名 = new ArrayList<>(长度);
在jdk8之前,ArrayList<>(); 相当于ArrayList<>(10) 会有默认长度10
在jdk8之后,一般建议使用 ArrayList<>(10);
ArrayList

添加元素

可以使用add方法添加元素
对象名.add(要添加的元素) / 对象名.add(要添加的位置下标,要添加的元素)
add()方法有两种,第一种单参数,是要添加的元素,直接添加到当前末尾;第二种为双参数,第一个参数是要添加到的位置下标,第二个参数是要添加的元素;
ArrayList这两种方法在添加时都会使用ensureCapacityInternal方法来确保elementData数组有足够的空间来存储待添加的元素ensureCapacityInternal的参数是为了存放这个元素elementData数组所需要的最小的大小。如现在数组内存放5个数,则所需最小大小就位size+1,即5+1=6。如果存放新元素所需的最小容量大于elementData数组的长度,也就是当前数组的容量不足的情况下,就会调用grow方法来扩容。
ArrayList扩容时会先记录原本数组长度oldCapacity,之后长度增长至原本的1.5倍(原本长度 + 原本长度右移一位(缩小至二分之一))
然后检查新容量是否大于最小需要容量,若还是小于最小需要容量,那么就把最小需要容量当作数组的新容量,如果新容量大于 MAX_ARRAY_SIZE,进入 hugeCapacity()方法来比较 minCapacity 和 MAX_ARRAY_SIZE,如果minCapacity大于最大容量,则新容量则为Integer.MAX_VALUE,如果minCapacity不大于最大容量,新容量大小为 MAX_ARRAY_SIZE
ArrayListArrayList
示例:
ArrayList正常加入为按顺序加入,第12行使用指定位置加入的方法将9添加至下标为1的位置

删除元素

删除时使用 remove(方法
删除对象也可通过指定下标删除或通过指定对象删除
通过指定下标删除:
ArrayListArrayList

首先调用rangeCheck判断指定下标是否大于ArrayList中元素个数,如果大于,则抛出索引越界异常,若不大于,用oldValue 保存索引处的值。之后用numMoved记录有多少个元素需要移动。如果要移动的元素大于0,则将index之后的元素前移。之后将最后一个数组空间设置为null,使用gc回收。

通过指定对象删除:
ArrayListArrayList

首先判断指定对象是否为空,如果指定的元素为空,则循环查找ArrayList中是否有空l元素,如果有则调用fastRemove移除并返回true。如果指定元素不为空,则循环,然后将指定元素与ArrayList中的元素使用equals进行比较,如果相等,则调用fastRemove移除并返回true;其它情况则返回false。fastRemove原理同使用下标删除元素。

注:在数组元素为Integer类型时默认只能使用按下标删除元素。
ArrayList在数组元素为Integer类型时默认只能使用按下标删除元素,所以删除了下标为1位置的元素。

修改元素

修改元素使用 set 方法:

ArrayList根据指定下标修改元素,首参数为指定要修改的元素下标位置,次参数是要修改为的元素;首先调用rangeCheck判断是否给定下标越界,若越界抛出索引越界异常,若不越界则先取出原本此位置的元素,之后用新元素代替并返回原本的元素
ArrayList成功修改下标1位置的元素。

查找元素:

查找(访问)元素使用get方法;

按指定下标查找:
ArrayList根据指定下标查找元素,首先调用rangeCheck判断是否给定下标越界,若越界抛出索引越界异常,若不越界则直接返回此下标位置的元素。

ArrayList使用get()方法查找下标4位置的元素,成功查找到。

清空:

清空列表使用clear()
ArrayList清空所有元素并将size设置为0。
ArrayList