一、ArrayList 概述
java.util.ArrayList 是 大小可变的数组 的实现,存储在内的数据称为元素。该类是一个 集合类(容器),可以让我们更便捷的存储和操作对象数据。
该类可以不断添加元素,其大小也自动增长,弥补了数组固定长度这一缺点。
java.util.ArrayList 集合数据存储的结构是数组结构。
特点:元素增删慢,查找快。
注意:此集合的实现不是同步的,多线程的,速度快,效率高。
二、ArrayList 使用步骤
1、查看类
java.util.ArrayList<E> : 该类需要 import 导入后使用
<E> 表示一种指定的数据类型,叫做泛型。 E ,取自 Element(元素)的首字母,在出现 <E> 的地方,使用一种引用数据类型将其替换即可,表示这个集合中存储哪种引用类型的元素。
2、查看构造方法
public ArrayList():构造一个内容为空的集合。
基本格式:
ArrayList<String> list = new ArrayList<String>();
在 JDK 7后,右侧泛型的尖括号之内可以留空,但是 <>仍然要写。简化格式:
ArrayList<String> list = new ArrayList<>();
三、构造方法
构造方法:
ArrayList():构造一个初始容量为10的空列表(JDK1.6)
ArrayList(int initialCapacity): 构造一个具有指定初始容量的空列表。
ArrayList(Collection<? extends E> c) 构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的
对于第一个无参的构造方法,来跟踪一下源码:
JDK1.8版本:发现内部初始化为了一个长度为0的空数组 DEFAULTCAPACITY_EMPTY_ELEMENTDATA
JDK1.7版本:也是初始化为长度为0的空数组 EMPTY_ELEMENTDATA;
JDK1.6 版本:初始化为长度为10的数组
思考:为什么要初始化为空数组呢?
这个因为在开发中,很多时候在方法中创建了 ArrayList 的对象作为返回值,但是可能这个里面没有元素,这个时候的话,如果初始化为10的数组,就浪费空间了。
四、常用方法
1、add(Object obj) 方法
源码跟踪(JDK1.8):
源码跟踪(JDK1.9):
总结:
JDK1.8中,第一次添加一个元素时,扩容为长度为10的数组,下次在添加时,会先进行容量的判断,如果够了,就不需要扩充了;如果不够,将扩充为1.5倍。
2、remove(int index) 方法
源码跟踪:
3、remove(Object obj)
源码跟踪:
4、set(int index, E ele) 方法
源码跟踪:
五、存储基本数据类型
ArrayList 对象不能存储基本类型,只能存储引用类型的数据。类似 <int> 不能写,但是存储基本数据类型对应的包装类是可以的。所以,想要存储基本数据类型,<> 中的数据类型,必须转换后才能编写。
基本包装类型:基本包装类型