一,简介
ArrayList继承自AbstractList是我们在开发中最常用的集合之一,他的底层是一个动态数组(elementData),可以放入多个的重复值,也可以放入多个null值,是线程不安全的.
查询遍历时比较快,但是在做插入和删除时会移动前后元素的位置,所以效率比较低
二.属性
DEFAULT_CAPACITY:默认的初始容量为10;
DEFAULTCAPACITY_EMPTY_ELEMENTDATA:无参构造器默认创建的数组长度为0(就是为什么ArrayList初始容量为0了)
MAX_ARRAY_SIZE:最大容量是Integer的最大值-8(具体多少自己算一下吧)
Object[ ] elementData:这个就是存储数据的地方了
size:表示存储了多少个数据
三.构造器:
使用的比较多的默认构造器,他给elementDate赋予了一个初始容量,就是一个空的数组;(初始为0)
带有初始容量的构造器,如果传递过来的参数大于0name就新建一个长度为initialCapacity的Object数组,如果等于0就给他一个空的数组,否则就抛出异常
这个构造器可以传递一个集合,调用toArray方法转换为数组之后判断他的长度,如果为0就赋值为空数组,如果不为0就判断数据类型然后进行数组的copy
四.常用方法:
size():
获取存放了多少元素,直接返回size
isEmpty():
判断集合是否为null,如果存入元素的大小为0就返回true
contains(Object o):
传入一个值判断在集合中是否存在,调用indexOf方法(下一个就是)
indexOf(Object o):
返回传入元素在数组中的下标位置(查找到第一个就进行返回)
lastIndexOf();
查询锁传入对象所在的最后一个索引
size-1的操作时为了避免数组越界
clone();
调用的时父类的clone方法,得到一个ArrayList然后再对elementData进行拷贝然后赋值给通过clone方法得到的数组
toArray():
转换为一个数组
get();
首先调用rangeCheck方法判断传入的索引值是否大于数组内存放元素长度,如果大于就抛出异常
add();
添加元素,代码很少,但是调用了一个方法,涉及到很多方法的调用判断,返正就是进行长度的盘端进行扩容
remove()(按照索引删除,返回删除的内容);
删除这个下标的值并将其返回,并且进行内部元素的移位(首先判断是否是最后一个,使用总个数-下标-1如果是最后一个结果为0,就将最后一个下标的值赋予null值,如果不是0就进行copy移位)
remove(Object o)(按照内容删除,删除全部的);
跟for循环遍历数组进行值的判断,equals比较值是否相等,如果相同就调用fastRemove方法进行删除((首先判断是否是最后一个,使用总个数-下标-1如果是最后一个结果为0,就将最后一个下标的值赋予null值,如果不是0就进行copy移位)
clear();
清空整个集合,将size归0