一、ArrayList 和 LinkedList 的区别有哪些
1.1 ArrayList
优点:ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高(在内存里面是连续存放的)。
缺点:因为地址是连续的,ArrayList要移动数据,所以插入和删除操作效率比较低。
1.2 LinkedList
优点:LinkedList基于链表的数据结构,地址是任意的,所以在开辟内存空间的时候不需要等一个连续的地址。对于新增和删除操作比较占优势
缺点:因为LinkedList要移动指针,所以查询操作性能较低。
1.3 使用场景分析
当需要对数据进行随机访问的时候选择ArrayList
当需要对数据进行多次增加或者删除修改的时候选择LinkedList
如果容量固定,并且只会添加尾部,不会引起扩容,优先采用ArrayList
二、ArrayList的特点
ArrayList是Java集合框架中的一种存放相同类型元素数据的变长类集合,基于定长数组实现,当加入数据达到一定程度后会实行自动扩容。
底层是数组,在添加元素时:
如果add(o),添加到的是数组的尾部,如果要增加的数据量很大,应该使用ensureCapacity()方法,该方法的作用是预先设置ArrayList大小,这样可以大大提高初始化速度。
如果add(int,0)添加到某个位置,可能会挪动大量数组元素,并且可能会触发扩容机制。
高并发情况下,线程不安全。多个线程同时操作ArrayList会引发不可预知的异常或错误。
ArrayList实现了Cloneable接口,标识着它可以被复制,里面的clone()复制其实是浅复制。
三、ArrayList比数组好在哪
在不明确要插入多少数据的情况下,不知道需要初始化数组大小为多少,而ArrayList可以使用默认大小,当元素个数达到一定程度的时候会自动扩容。