java面试之ArrayList和LinkedList的区别

一、两者的数据结构

(1)我们先看下ArrayList的源码;

java面试之ArrayList和LinkedList的区别_第1张图片

     它主要继承了一个抽象类AbstractList,并且实现了RandomAccess接口,而且ArrayList的数据是使用数组Object[] 来存放的,也就是说它的数据结构是基于动态数组的

(2)再看下LinkedList的源码;

java面试之ArrayList和LinkedList的区别_第2张图片

它主要也是继承了一个抽象类AbstractSequentialList,这个抽象类也是继承自AbstractList抽象类,注意区别, 它没有继承RandomAccess接口,但是继承了 Deque,继续往下看,看到了Node first,Node last这种写法,是不是很熟悉,学过C的肯定不会觉得陌生,是的, LinkedList是基于双向链表

二、两者的区别和相同点

1、先说相同点;

(1)都属于集合,都继承了AbstractList抽象类及其父类,AbstractList定义的方法,两者都实现了;

(2)都实现了List,因此List定义的方法也都实现了,存放的数据类型都没有限制;

2、区别;

(1)ArrayList基于数组的数据结构,而LinkedList是基于双向链表的数据结构;

(2)ArrayList的初始容量是10,有点浪费内存,LinkedList的初始容量为0,采用动态增加容量,添加多少算多少;不会浪费内存;

(3)基于2者数据结构不同,ArrayList查询速度快,数组直接根据下标就可以查询到目标数据,但是增删数据比较麻烦,因为你删一个,就意味着其他的数据,下标也都不一样了,需要移动数据;LinkedList恰好相反,由于其双向链表结构,使得其查询速度比较慢,查询的时候需要从第一个开始往后遍历查找,数据少还好,数据多了,就性能很差了,但是其增删速度却很优秀,因为有next指针指向其下一个节点,通过改变指针的指向可以方便的增加删除元素;意思是它增删数据,只需要改变插入数据的2端的next指向就好了;看张示意图就明白了;

java面试之ArrayList和LinkedList的区别_第3张图片

(4)ArrayList中的操作不是线程安全的!建议在单线程中才使用ArrayList,而在多线程中可以选择Vector或者CopyOnWriteArrayList。LinkedList也是非线程安全的,但是可以通过下面的方式实现线程安全;

    方法一:List list = Collections.synchronizedList(new LinkedList());
    方法二:将LinkedList全部换成ConcurrentLinkedQueue

 

 

 

 

 

你可能感兴趣的:(java面试之ArrayList和LinkedList的区别)