源码分析ArrayList、LinkedList和Vector

源于蚂蚁课堂的学习,点击这里查看

1.ArrayList

 

 

 

 

1.add时根据当前数组的容量和需要添加数据所需要的最小容量比较,判断是否需要扩容,如果需要的话,默认扩容1.5倍,
1.5倍不够的话,就扩容至最小容量;然后就此次要添加的数据放入数据对应下标位置,并有效长度+1
2.remove时,会先去检查数组下标是否越界。然后会根据下标将对应下标位置的之后的数据进行移动覆盖操作(前移)。
将数组有效长度最后一位置空,并有效长度-1
3.size()返回的是数组的有效长度,并不是数组的实际长度,比如数据扩容至10,可能只有一个元素,那么数组的size为1但是length为10
4.arrayList中每次在进行增删操作时都会有一个全局的modcount增加,其主要防止多线程情况下,出现脏读情况,而做出一个
fali-fast机制的响应。如:多个线程同时插入和查询,这样fail-fast就会扔出一个异常
5.由于arrayList的增删改都没有加锁,所以它非线程安全。
6.arrayList使用下标去存放数据,故其查询很快
7.arrayList增删元素是靠数组copy的方式去扩容或移动覆盖,所以其增删效率特别低

 2.CopyOnWriteArrayList

 

 

CopyOnWriteArrayList
1.功能与arrayList相仿,线程安全的,因为它的方法加上了lock锁,但正因为它的get方法也加上了,导致其效率低
2.add方法只扩容添加元素的长度
3.适用于读多写少的场景

 3.Vector

 

 

1.原理与arrayList相同,扩容默认2倍,可以在创建时指定其扩容长度
2.线程安全,被synchronized修饰了增删改查方法,所以效率很低,很少使用

 4.LinkedList

 

 

 

 

 

LinkedList
1.通过一个静态内部类Node去维护内部数据结构
2.add时在链表末尾直接新增一个节点,并设置连接
3.get(index)通过二分折半查询的方式从头或尾去一次查询对应的数据
4.remove(index)按照get(index)查询出对应的node,解除此node的链接
5.LinkedList底层通过双向链表的方式存放数据,所以查询效率较低,但易于增删
6.LinkedList非线程安全,增删改没有加锁或
原创文章 148 获赞 258 访问量 11万+

猜你喜欢

转载自blog.csdn.net/yxh13521338301/article/details/105511053