一.ArrayList与LinkedList的区别
相同点
首先,ArrayList与LinkedList都为List接口的实现类,因此具有List接
口的公共特点:集合有序;允许重复值的出现。
不同点
1.数据结构的实现不同。ArrayList是基于数组Objiect[] elementData实现,LinkedList是基于双向链表实现,每一条数据都是由pre(前一个元素地址),item(数值),next(后一个元素地址)组成。
2.扩容方式不同。ArrayList的扩容首次长度增加为10,后面每次扩容1.5倍。LinkedList由于数据结构组成是双链表,其长度不受数据影响,所以不需要扩容。
3.适用场景不同。ArrayList基于数组实现,所以适合连续性遍历,读操作。LinkedList基于双链表实现,所以适合频繁的删除添加,写操作。
常用方法
List接口中具有的增删改查方法ArrayList与LinkedList全部具备,只不
过LinkedList由于是双链表,所以它可以直接对首尾元素进行操作。
总结,一个类型的集合具有什么样的特点取决于,在底层的数据结构属于什么类型。类型不同,特点不同,适用场景也就不同。
二.ArrayList与Vector的区别
相同点
首先,ArrayList与Vector都为List接口的实现类,因此具有List接口的
公共特点:集合有序;允许重复值的出现。
其次两者都实现了RandomAccess接口,支持快速访问,也就是使用for循环
进行便利的速度更快。
不同点
1.扩容方式不同。ArrayList的扩容首次长度增加为10,后面每次扩容1.5倍。Vector每次扩容2倍,或者支持自定义扩容。
2.安全性与性能。ArrayList线程安全性低,而性能高。Vector牺牲性能,追求线程安全(synchronized关键字)。
三.ArrayList的扩容方式
ArrayList在Java中的存储的依靠数组的,基于数组Objiect[]
elementData实现,而数组在初始化时必须定义数组长度,而现实生活中
我们往往不确定存入数组的元素有多少个,这时就引发了扩容这个问题。
1.ArrayList的存储依靠与数组,所以在初始化ArrayList对象时,我们可以选择有参或无参两种方式。
2.有参构造时,我们会将传入的参数作为数组的初始长度,在后续赋值过程中,如果长度不足时,会将数组的size按照原容量的1.5倍进行扩张,直至扩大至Integer的最大值,如果超出则会抛出OutOfMemoryError。
3.无参构造时,当我们给集合添加第一个元素时,我们会将数组的size设置为10,然后当添加第11个元素之后,每次扩容都是扩大原容量的1.5倍,直至扩大至Integer的最大值,如果超出则会抛出OutOfMemoryError。
四.LinkedList的适用场景
由于LinkedList基于双链表实现,所以他相比较与List的其他实现类多了获取头元素,尾元素,添加头元素,尾元素,删除头元素,尾元素,等对头元素尾元素执行的操作。