参考链接:https://blog.csdn.net/wz249863091/article/details/52853360
List主要分为三类:ArrayList,LinkedList,Vector
- ArrayList:ArrayList是一个数组实现的列表,由于数据是存入数组中的,所以它的特点也和数组一样,查询很快,但是中间部分的插入和删除很慢。
- ArrayList有2个构造函数,一个是默认无参的,一个是传入数组大小的。
- 在JavaEffect书中明确提到,如果预先能知道或者估计所需数据项个数的,需要传入initialCapacity,因为如果使用无参的构造函数,会首先把EMPTY_ELEMENTDATA赋值给elementData然后根据插入个数于当前数组size比较,不停调Arrays.copyOf()方法,扩展数组大小,造成性能浪费。
- 主要的方法为:add(int index,Element e),remove(int index),indexOf(Object obj),rangeCheck(int index),成员变量:size。
- Vector:Vector就是ArrayList的线程安全版,它的方法前都加了synchronized锁,其他实现逻辑都相同。 如果对线程安全要求不高的话,可以选择ArrayList,毕竟synchronized也很耗性能。
- LinkedList:故名思意就是链表,和数据结构里学的链表是一回事,LinkedList还是一个双向链表。内部维护了3个成员变量,一个是当前链表的头节点,一个是尾部节点,还有一个是链表长度。
- 主要方法为:add(Element e),indexOf(Object obj),remove()
- List特征【调用indexOf()时】:1.是按顺序查找 2.允许存储项为空 3.允许多个存储项的值相等
- 调用remove时:如果直接调无参的remove(),就会默认删除头节点,删除头节点非常简单,就是把头节点的值清空,next清空然后把nextNode只为头节点,然后清空next的prev,最后size减1,如果是删除中间节点,调用remove(int index),首先判断Index对应的节点是否为头节点,即index是否为0,如果不是中间节点,就是x的prev指向x的next。
-
总结:
- ArrayList是由数组实现的,方便查找,返回数组下标对应的值即可,适用于多查找的场景。
LinkedList由链表实现,插入和删除方便,适用于多次数据替换的场景。