前面讲过,数组有很多缺点且使用不太方便,但是我们存储数据的时候很多情况又不得不使用它,那么有没有对数组封装一下的类,让我们更方便呢?答案是有的,他就是 ArrayList,他是一个基于数组的集合,如源码所示:
public class ArrayList<E> {
transient Object[] elementData;
}
ArrayList 的特点:有序、可重复、可存 null 值
ArrayList 的优点:查询快,知道索引瞬间查到,他是所有集合当中查询速度最快的
ArrayList 的缺点:增删慢
- 因为之前提到过数组一旦创建长度就固定了,在使用的过程中,不能更改,所以说数组一旦满了就得扩容,扩容的操作是先创建一个原来容量1.5倍的新数组,然后将之前数组的元素拷贝到新数组中来,再添加新数据;由于扩容需要新建数组且拷贝之前到元素到新数组中,所以说数据越多,操作越慢。
- 同样的道理,在执行插入操作的时候,需要将插入节点之后所有的数据向后移动,执行删除操作时,有需要将删除节点之后的所有数据向前移动,由于需要移动数据,所以说操作的节点之后的数据越多,操作越慢。
这里说一下数组的两个概念:大小、容量
大小指的是数组元素的个数,容量指的是数组本身的长度(最多可存储的元素个数)
ArrayList 的创建方式
public class ArrayList<E> {
public ArrayList()
public ArrayList(int initialCapacity)
public ArrayList(Collection<? extends E> c)
}
通过无参构造创建时,数组的默认初始容量是10
通过指定长度参构造创建时,数组的初始容量是指定的长度
第三种在创建时,会将传入的集合数据存储到数组中,数组的初始容量是传入集合的长度
ArrayList 的常用方法
ArrayList 作为 List、Collection 的子类,他具有他们所有的方法,但是常用的方法只有10个,我们来做一下分类:
ArrayList 和 LinkedList 的区别
分类 | ArrayList | LinkedList |
---|---|---|
数据结构 | 数组 | 链表 |
查询速度 | 快 | 慢 |
增删速度 | 慢 | 快 |
存储相同数据所需要的空间 | 小 | 大 |
应用场景 | 查询较多 | 增删较多 |