ArrayList 、LinkedList的区别,底层的实现呢了解吗,有没有什么优缺点,分别适合于什么样的场景

ArrayList 、LinkedList的区别,底层的实现呢了解吗,有没有什么优缺点,分别适合于什么样的场景,多线程环境下,有没有安全的 list的实现类呢?

Arraylist 与 LinkedList都属于实现了List接口的类,首先通过名字来看 Array表示数组,Link表示链表。
所以Arraylist底层是基于动态数组的,而LinkedList底层是基于双向链表的。
ArrayList必须是连续内存的,而LinkedList不要求是连续内存。
ArrayList查询快,增删慢;Linked增删块,查慢。
(arraylist查询效率高, 是因为arraylist可以连续存放元素的,找到第一个元素的首地址,再加上每个元素的占据的字节大小就能定位到对应的元素

linkedlist插入删除效率高,是因为执行插入操作时,只需要操作引用,元素之间不需要移动,他们分布在不同的地方,通过引用来互相关联起来。而arraylist需要移动元素,故效率低)

也就是arraylist底层是动态数组,所以查询时直接通过访问下标,查效率高,而增加和删除某一个位置后,后方元素都得向前移动一位。
当然最坏情况就是删除第一个元素,而后面的第2到第n个元素都得往前移动一位,所以增删慢。

那为什么说arraylist是基于动态数组呢,一般数组,容量确定了就不可以在更改,也无法超过,但是arraylist可以。
例:当数组元素数已满时调用了add方法向尾部添加一个元素,则此时会进行扩容,arraylist会 Arrays.copyOf 复制一个更大的数组 1.5倍,而原数组会被抛弃,被GC回收。

posted @ 2020-09-15 22:51  九角冰山  阅读(435)  评论(0编辑  收藏  举报