ArrayList、LinkedList、Vector的异同

相同点:

三各类都是实现了List接口,存储数据的特点相同,存储有序的、可重复的数据。

不同点:

ArrayList

(JDK1.2出现):作为List接口的主要实现类,线程不安全的,效率高;底层使用Object[] elementData存储。

ArrayList源码分析:

 * ArrayList源码分析:
 * JDK 7的情况下
 *  ArrayList list=new ArrayList();//底层创建了长度为10的Object[]数组elementData
 *  list.add(123);//elementData[0]=new Integer(123);
 *  ...
 *  list.add(11);//如果此时的添加导致底层的elementData数组容量不够,则扩容。
 *  默认情况下,扩容为原来的1.5倍,同时需要将原有数组中的数据复制到新的数组中。
 *
 *  结论:建议开发中使用带参数的构造器:ArrayList list =new ArrayList(int capacity);
 *
 * JDK 8的情况下
 * ArrayList list=new ArrayList();//底层的Object[] elementData初始化为{},此时并没有创建长度为10的数组
 * list.add(123);//第一次调用add()时,底层才创建了长度为10的数组,并将数据123添加到elementData数组中
 * ...
 * 后续的添加和扩容与JDK7相同。
 *
 * 总结:JDK7中的ArrayList对象的创建类似于饿汉式单例模式,而JDK8中的ArrayList对象的创建类似于懒汉的单例模式,延迟的数组的创建,节省内存。

LinkedList

(JDK1.2出现):对于频繁的插入、删除操作,使用此类效率比ArrayList高,底层使用的是双向链表作为存储。

ArrayList源码分析:

 * LinkedList源码分析:
 * LinkedList list=new LinkedList();//内部声明了Node类型的first和last属性,默认值为null
 * list.add(123);//将123封装到Node中,创建了Node对象。
 * 其中,Node定义为:体现了LinkedList的双向链表说法

Vector

(JDK1.0出现):作为List接口的古老实现类,线程安全的,但是效率低;底层使用的Object[]存储

ArrayList源码分析:

 * Vector源码分析:
 * JDK7和JDK8中,通过Vector()构造器创建对象时,底层都创建了长度为10的数组,
 * 扩容方式:默认扩容为原来的二倍。

希望我的博客对您有所帮助。

原创文章 86 获赞 50 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qizhi666/article/details/104349813