Arraylist特点
- 底层数据结构是数组
- 查询快,插入删除慢(特殊情况除外)
- 默认初始容量为10,每次扩容增加当前容量值的一半
- 非线程安全
- 可以存储重复元素
LinkedList特点
- 底层数据结构是链表
- 查询慢,插入删除快
- 非线程安全
- 可以存储重复元素
- 适用于要头尾操作或插入指定位置的场景
Vector特点
- 基本和ArrayList一样,只是所有方法都使用synchronized修饰
Arraylist查询为什么比LinkedList快?
因为ArrayList使用数据下标直接就获取到数据的内存地址,而LinkedList内部需要循环移动指针到要查询的位置,所以查询操作性能比较低。
Arraylist插入删除为什么比LinkedList慢?什么情况下比LinkedList快?
因为当在ArrayList中插入或删除数据时,ArrayList内部需要将要操作位置后面的数据后移或者前移一位(本质为复制数据),容量不够时还需要进行扩容。而linkedlist内部只需要将指针循环到要操作位置,然后改变要操作位置的node的前后指针即可
当使用new ArrayList<>()方法初始化,在第一次add的时候,ArrayList内部默认初始化了一个容量大小为10的数组,当容量不够时,进行自动扩容,扩容后大小增加一半,即10-->15-->22-->33。扩容:重新new一个数组,然后将原数据复制进新数组。
插入或删除元素的位置越靠前,ArrayList的速度越慢,反之,插入或删除元素的位置越靠后,ArrayList的速度越快,甚至超越linkedlist,当直接在list尾部添加或删除数据时,Arraylist和LinkedList速度基本一样。
因为当list内数据足够多的时候,插入或删除元素的位置越靠前,ArrayList需要移动的数据就越多,而LinkedList需要移动指针的步数却越少