我们经常听说LinkedList、vector、ArrayList以及CopyOnWriteArrayList,就以add为例(我写的仅仅是记录,之后会继续研究,希望大佬们多多提建议)
1、LinkedList:
你会发现其中调用了linkLast()这个方法,在查看的时候,其中的方法应该是可以看懂的吧(有可能不正确,仅供参考使用哦),指针指向的是数据地址
这样的话数据就会被添加到list中,结构就是下面图片中显示的那样,它只记录的相邻的两个数据的上下数据节点,而且因为是一个环链,所以最后一条数据会与第一条数据相互记录
但是当你选择添加数据的位置时,调用了linkBefore这个方法,可以看到,其中更改的也是指针指向
2、Vector
Vector会默认赋予长度为10的空间,当空间不够数据存储时,如果没有指定新增空间大小,那么会以两倍的方式增长
注:vector是用synchronized来修饰方法的
3、ArrayList:
这个其实与Vector 一样,只不过Vector是线程安全的而ArrayList是线程不安全的,而且ArrayList在扩容的时候扩容因子是1.5,所以在执行效率上,ArrayList是比Vector快不少的
上面的minCapacity有可能是用户自己输入的初始容量
在这与Vector不一样的是,ArrayList的扩容是 1.5n + 1,而且如果使用的是无参构造函数,那么ArrayList是不会开辟默认空间的
4、CopyOnWriteArrayList:
从上图可以看出CopyOnWriteArrayList使用了锁,并且会在下图的方法中,进行两次复制,将修改过后的值返回,如果在返回之前读取该数据,那么读取到的数据将会是旧数据
注:CopyOnWriteArrayList是用ReentrantLock来加锁的