Vector、ArrayList以及LinkedList的联系和区别,分别的使用场景

Vector、ArrayList以及LinkedList的联系和区别在Java程序员面试中是经常会考察的问题。对于这个问题我个人做了以下几点总结,如果有不对的地方,欢迎其他小伙伴指出不足并加以修正!

首先:从线程安全的角度考虑问题,我们知道在多线程的情况下,考察是否线程安全的重点其实在于是否加锁,如果多个线程操作同一个对象时方法里并没有加锁,那我们可以认为其是线程不安全的。

  1、ArrayList:底层是数组实现,线程不安全。优势在于查询和修改非常快,但是增加和删除非常慢。快在于查询和修改都是通过数组的下标去实现的,而增加和删除慢是在于假如我们有1000个元素,在这10000个元素中插入和删除需要移动元素,所以很慢。我们可以通过查看底层源码就可以发现:

其实就是ArrayList的构造方法其实就是以数组的形式实现的。

之后我们可以查看其线程是否安全,只要去查找对应的方法有没有加锁就可以知道!

我们可以在main方法里面添加一个方法new ArrayList().add("")中点进去可以看到,并没有对应的加锁方法,所以我们认为其实线程不安全的。


2、LinkedList:底层是双向链表,线程不安全,查询和修改很慢,但是增加和删除很快。我们可以通过一个简单的示例来看一下,我们可以在main方法里面添加一个方法new LinkedList().add("")中点进去可以看到,并没有对应的加锁方法,所以我们认为其实线程不安全的。


双向链表其实含有一个前驱和后驱以及指针的概念,查询和修改速度慢的原因在于需要循环遍历这个集合,然后去寻找对应的节点所以很慢,而增加和删除很快在于只要找到需要剔除的节点就好了,然后把前驱节点指向另外的指针。

3、Vector:底层是数组实现,我们可以发现是线程安全的,因为在对应的add方面中使用了synchronized关键字,所以在执行效率上面并没有上面两个方法高。以下是对应的源码,使用了加锁:


其次,我们可以通过使用场景对这三种集合进行描述:

1、Vector使用的场景已经很少了

2、需要操作增加和删除场景多的情况下,使用LinkedList

3、需要操作修改和查询场景多的情况下,使用ArrayList

你可能感兴趣的:(Vector、ArrayList以及LinkedList的联系和区别,分别的使用场景)