文章目录
ArrayList源码
总:
**ArrayList
**底层是使用名为 **elementData
的Object
动态数组进行实现,与Java中的数组相比,她的容量能够动态的进行增长。在我们更新元素的时候,我们会通过ensureCapacityInternal()
方法来确保我们的容量够用,如果容量不够则调用grow()
**方法对我们的数组进行扩容为1.5倍,然后将我们原来的的数组复制过去。
ArrayList 和 Vector 的区别?
ArrayList
是List
的主要实现类,底层使用Object[]
存储,适用于频繁的查找工作,线程不安全 。Vector
是List
的古老实现类,底层使用Object[]
存储,线程安全。
ArrayList 可以添加 null 值吗?
ArrayList
中可以存储任何类型的对象,包括 null
值。不过,不建议向ArrayList
中添加 null
值, null
值无意义,会让代码难以维护比如忘记做判空处理就会导致空指针异常。
Arraylist 与 LinkedList 区别?
Arraylist 和 LinkedList都是实现了 List接口,都是线程不安全的。
不同点:
- Arraylist底层是通过object数组进行实现,而LinkedList底层是通过双向链表进行实现
- AL实现了随机读取接口,能够随机进行读取,用来查询的效率高,LL不能进行随机读取,只能遍历进行读取,但是她的插入效率高
- 内存空间的占用上,AL的预留空间会占用一定的位置,而LL会占用更多的空间,因为要保存其他的一些位置信息
构造方法
Arraylist有有参构造方法也有无参构造方法,有参的构造方法会将我们的容器大小设置为设置的大小
无参构造方法先是将提前创建好的空数组给他,后续使用的时候在进行扩容操作
扩容机制
这里每次add操作的时候都会使用ensure CapacityInternal()方法进行容量判断,如果不足则会使用grow进行扩容
private void ensureCapacityInternal(int minCapacity) {
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
这里的calculate Capacity方法主要是判断容器是否是已经初始化过
private static int calculateCapacity(Object[] elementData, int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
return Math.