List集合类的实现方式分析(JDK1.8+IDEA14)

List

> ArrayList:

1、初始容量大小为10,同时可以传入int值自定义初始大小
这里写图片描述
2、新增对象时,首先进行容量检查,如果没有越界,就在下一个未使用的索引处存入需要插入对象的引用,
如果越界,就以1.5倍的因子扩展大小,这时需要一个拷贝动作,其实内部存入的是在一个Object[]中
这里写图片描述
3、移除对象,拿到需要移除的索引,将数组Object[]中的指定索引的值置为null
这里写图片描述
4、获取对象,get方法
这里写图片描述

可以看到,get方法依然是很高效的,它直接从数组中拿取索引对应的对象


> LinkedList

1、对于LinkedList来说,没有初始容量这种说法
2、新增时,是执行了一个连接前后对象的方法
这里写图片描述
新增对象时存放在LinkedList中的内部类私有类对象中Node
这里写图片描述
LinkedList中有个属性存储第一个Node和最后一个Node

transient Node<E> first;
transient Node<E> last;

新增第一个时,这俩值都为null,然后执行上面图1那个方法,然后第一个节点和最后一个节点都有值了!
再次新增时就会改变LinkedList中的last属性,这样就是链表的存储结构
3、remove移除
通过索引
这里写图片描述
然后进入node方法内部看看,它为了提高效率,执行一次二分查找
这里写图片描述
然后来看看unlink,它是进行前后Node对象中记录的前后节点记录移除和拼接
这里写图片描述
4、获取对象,get方法,get方法是通过图2,一次二分查找来获取指定位置的对象
这里写图片描述
通过这三个函数可以很明白的看到,
对于LinkedList,移除对象只是简单的修改这个对象前后的对象的记录信息,可以很高效 ,

而ArrayList,移除时要调用copy函数进行整个数组复制,从而保证集合内对象的正常索引顺序;

对于add来说,反而是ArrayList的执行效率更高一些,因为新增只是在最后追加一个对象,并不需要维护索引;

对于查找,ArrayList的效率要高于LinkedList,因为LinkedList还要通过二分查找来逐个查找最终获取到对象

(LinkedList中任意对象只知道它左右两边的对象的地址,而LinkedList对象只记录了它存放的第一个和最后一个对象的地址,因此要想找到第n个,只能从最前面或最后面,一个一个一直找到第n个前面的对象或者后面的对象,然后调用这个Node对象的prev或者next就拿到我们要找到对象了)
这里写图片描述

注意:这是一般情况下,,但是有些情况并非如此(任何事情都不是绝对的,是针对大多数情况而言的),
比如在对ArrayList进行add时,正常情况效率很高,但是当容量需要扩展时,效率就会很低,
因为这时需要进行数组的拷贝动作;

LinkedArrayList

这个对象的实例化形式只有一种,指定List容量,并且一旦指定不允许修改这么一来,
对它的后续操作都是很固定的了,可以当做数组一样操作,不存在数组的拷贝这个大的消耗动作,但是,,
这个东西存满了后会回到第一个索引处进行覆盖,,,这个有点搞笑,,,
不过想想在某些方面确实会有这些用途,,比如你要定一个数组存放曲线图像显示数据,可以用这个东西来自动刷新显示!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值