1、ArrayList和Vector的区别?
2、ArrayList、Vector和LinkedList的区别?
1、ArrayList和Vector的区别?
一、ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要讲已经有数组的数据复制到新的存储空间中。当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。
二、Vector与ArrayList一样,也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。
Vector的初始化容量10,但他每次扩容的容量是原先的两倍,但是ArrayList是原先的1.5倍。
Vector提供的大多数方法都是被同步锁修饰的方法。下面我们来看一下底层代码,从而来查看两者之前的相同点和不同点↓
这是两者底层代码的相同之处,虽然都有大的相同之处,但是有一点不同的是两者的修饰符是不太相同的,Vector有synchronized修饰符修饰,而ArrayList则没有,下面我把两者相差较大的代码截给大家看一下:
这是Vector的扩容代码块
这是ArrayList的扩容代码块
可以看出这两块的容量扩增是有明显的差异的。
2、ArrayList、Vector和LinkedList的区别?
前两者的区别其实是不大的,我们能看到期间的不同之处,具体我在上面做过阐述了,第二点我来讲前两者
首先ArrayList、Vector和LinkedList类均在java.util包下
其次ArrayList和Vector都是基于存储元素的Object[] array来实现的,它们会在内存中开辟一块连续的空间来存储,因为数据存储是连续的,所以它们支持用下标来访问元素,索引数据的速度比较快。
1)ArrayList和Vector都有一个初始化的容量大小,当里面存储的元素超过初始的大小时就需要动态地扩充,它们的存储空间,Vector默认扩充为原来的两倍(每次扩充空间的大小可以设置),ArrayList默认
扩充为原来的1.5倍(没有提供方法来设置空间扩充的方法)。
2)ArrayList和Vector最大的区别就是synchronization的使用,没有一个ArrayList的方法是同步的,而
Vector的绝大多数方法(如add,insert,remove,set,equals,hashcode)都是直接或间接同步的,所以Vector
是线程安全的,ArrayList不是线程安全的。正是由于Vector提供了线程安全的机制,其性能上也要稍逊于ArrayList
LinkedList是采用双向列表来实现的,对数据的索引需要从列表头开始遍历,因此用于随机访问则效率比较低,但是插入元素时不需要对数据进行移动,因此插入效率较高。同时,LinkedList是非线程安全的容器。
对容器的选择:
当对数据的主要操作是索引或只在集合的末端增加、删除元素时,使用ArrayList或Vector效率比较高,当对数据的操作主要为指定位置或删除操作时,使用LikedList效率比较高;当在多线程中使用容器时,选用Vector较为安全。
并且LinkedList是基于双向链表的实现。
下面我们来看看LinkedList的底层代码:
然后他还有很多中方法,毕竟太多,我就不详细展开这些方法的源码了,所以我把这些方法展示出来给大家看一下: