ArrayList源码粗略解读(面试必问)

前言

现如今的Java程序员越来越多,学习者也越来越多。基本上使用Java的都会使用过HashSet、HashMap、ArrayList、LinkedList等集合,今天god-jiang就从源码层面上粗略解读一下ArrayList这个常用集合。

若是有写得不好的地方或者有错误,请读者提出,毕竟我也是一名菜鸡。

1、ArrayList的介绍

ArrayList是一个容量能够动态增长的动态数组。但是它和数组又不一样,它继承了AbstractList,实现了List、RandomAccess(随机访问)、Cloneable、Serializable接口。

2、ArrayList的构造函数

在JDK1.8的版本下,ArrayList有三个构造函数。分别是:

  • ArrayList():构造一个初始容量为10的空数组列表
  • ArrayList(int initialCapacity):构造一个具有初始容量值的空数组列表
  • ArrayList(Collection c):构造一个包含指定元素的数组列表

源码如下:

img

img

img

3、ArrayList的add操作

在JDK1.8的版本里,add操作有两种,一种是按顺序一直添加,另一种是给定一个位置再添加。源码如下:

img

img

就是进行add操作的时候,需要先进行ensureCapacityInternal操作,就是size+1判断是否需要扩容了,如果不需要,则直接插入,然后size++。如果需要扩容,就会扩容到原来的1.5倍,源码如下:

img

4、ArrayList的遍历方式

给出ArrayList遍历常用的三种方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
* @author god-jiang
* @date 2020/4/3 14:22
*/
public class ArrayList_Resource {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("李白");
list.add("露娜");
list.add("韩信");

//1、迭代器
Iterator<String> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
System.out.println("================");

//2、for
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
System.out.println("================");

//3、for-each
for (String str : list) {
System.out.println(str);
}
}
}

肯定会有人问用哪个比较好,这里我只能说博主经常使用的是第二种遍历方式,因为效率最高。为啥效率最高,可以自己加入系统时间算时间差来比较得出。

5、ArrayList和LinkedList的区别(面试常问)

  1. 是否保证线程安全:ArrayList和LinkedList都是不同步的,也就是不保证线程安全;
  2. 底层数据结构:ArrayList底层使用的是Object数组;LinkedList底层使用的是双向链表;
  3. 插入和删除是否受元素位置影响:ArrayList采用数组存储,所以插入和删除元素的时间复杂度受元素的位置影响,为O(N)。LinkedList采用链表存储,所以插入和删除元素的时间复杂度不受元素位置的影响,为O(1);
  4. 是否支持快速随机访问:LinkedList不支持高速的随机元素访问,而ArrayList支持;
  5. 内存空间占用:ArrayList的空间浪费主要体现在List列表的结尾会预留一定的容量空间,而LinkedList得空间花费体现在它得每一个元素都需要消耗比ArrayList更多的空间(因为要存放直接前驱和后继以及数据等)。

总结

今天的ArrayList源码就讲这么多,还有一些remove操作和contains操作我就没有写出来,不是说它们不重要,而是我把相对重要和常问的点拿出来讲一下。对ArrayList其他操作感兴趣可以自己看看源码,这个东西对你只会有好处而不会有坏处。

谢谢大家,有错误或者写得不好的欢迎评论区评论或者私聊。

-------------本文结束感谢您的阅读-------------

本文标题:ArrayList源码粗略解读(面试必问)

文章作者:god-jiang

发布时间:2020年04月03日 - 15:05:53

最后更新:2020年04月03日 - 15:33:22

原始链接:https://god-jiang.github.io/2020/04/03/ArrayList源码粗略解读(面试必问)/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

创作不易,您的支持就是我坚持的动力,谢谢大家!
0%