前言
说到List我们都会提到它的顶级结构collection,collection也就是我们经常说到的java集合框架之一,通常我们在面试或平常都会说collection下有list和set接口,但是实际代码是这样的么,我们来看看真实的collection类图
collection类下的子类其实不少,只不过我们实际工作中经常用到的就是我标红的三种,List,Set,Queue,今天我们的主角就是其中之一的List接口,既然今天要看List,首先我们来看一下List的类图
List中我们常用的子类有ArrayList,Vector,LinkedList,CopyOnWriteArrayList,List是存储有序的可重复的元素的,且该元素可以是null
接下来我们简单的看看这四种List,给个简单的结果定义
/**
* 普通数组实现的,线程不安全
*/
static List<String> arrayList = new ArrayList<String>();
/**
* 双向链表实现的,线程不安全
*/
static List<String> linkedList = new LinkedList<String>();
/**
* 普通数组实现的,线程安全,方法级别的synchronized锁
*/
static List<String> vector = new Vector<String>();
/**
* 普通数组实现的,线程安全,方法内部ReentrantLock锁
*/
static List<String> copyOnWriteArrayList = new CopyOnWriteArrayList<String>();
关于线程不安全,大家有兴趣的可以去看看我的另外一篇博客,线程不安全是怎么来的
https://blog.youkuaiyun.com/jy317358306/article/details/111598874
ArrayList
ArrayList的类图
首先我们来看看ArrayList,先上ArrayList的类图结构
从上图我们可以看到,ArrayList的初始长度为10,我们要注意下ArrayList真实结构上的这段注释
/**
* The array buffer into which the elements of the ArrayList are stored.
* The capacity of the ArrayList is the length of this array buffer. Any
* empty ArrayList with elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA
* will be expanded to DEFAULT_CAPACITY when the first element is added.
*/
这段注释讲了四点:
1.这个Object[] elementData是ArrayList存储元素的数组缓冲区
2.ArrayList的长度就是这个数组缓冲区的长度
3.任何初始的空的ArrayList的初始时默认的Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA 这个空数组
4.只有当有第一个元素添加的时候才会被扩容至默认的10的长度的数组
ArrayList的构造方法
接下来我们看看初始化方法
无参构造,直接将默认的空数组赋值给到了elementData
有参构造,根据传入的容量大小来创建数组,有趣的是,这里初始长度为0的时候赋值的不是默认的空数组,而是另外一个空数组
ArrayList的线程的不安全的问题
首先上测试代码:
/**
* 线程个数
*/
private static final int COUNT = 5000;
/**
* 普通数组实现的,线程不安全
*/
static List<String> arrayList = new ArrayList<String>();