List接口中的常见问题

一.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的其他实现类多了获取头元素,尾元素,添加头元素,尾元素,删除头元素,尾元素,等对头元素尾元素执行的操作。

LinkedList在底层的实现是双链表,所以方便进行频繁插入,删除,等操作,也不需要考虑扩容问题,但是并不擅长随机访问。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值