ArrayList和LinkedList的知识点及区别

ArrayList

说ArrayList是数组不是很完善,相对于普通数组来说他是一种动态数组,是一种连续的内存存储,在内存中他是连续存储的,而链表是分散在内存中的,对内存的要求不是很高,就是内存哪怕是碎片空间也可以做存储。所以在内存这一块ArrayList必须要有连续的内存空间,在生成内存的时候要求就会高一点。
正因为连续储存的结构,而且在数组中存储的类型是一致的,所以适合下标访问,因为每个元素在数组中占得内存长度是一样的,用下标访问会非常的快。
用(一个元素所占的内存长度) * (下标位置)就能很快的找到元素所在下标的值。

LinkedList

LinkedList就没有这种优势了,因为他分散在内存中,不知道在内存的哪个角落,是要根据链表的指针一个一个的找,所以觉得LinkedList遍历起来会很慢,需要一个一个节点往下去找,才能找到要的元素。所以不适合于查询。
比如说这个链表:
在这里插入图片描述
在内存中这几个节点可能在不同的位置,如果往两个元素之间插入元素,只需要把这条线断开再连上这两条线就可以了:
在这里插入图片描述

ArrayList不适合插入删除的原因

原因就在于new一个数组的时候,这个数组的长度就已经固定了,比如new了一个长度为10的数组,放第11个元素的时候是肯定放不下的,会下标越界,ArrayList实际是新建了一个数组,原来的数组是一个old数组,ArrayList会建一个新的数组重新new一个数组,进行扩容,成15,然后把老数组里的值copy进来,然后再把第11个元素放进去。也存在另外的情况比如说在中间插入,就算有空位不需要扩容,也需要一个个copy下来然后把元素放入到指定的位置,这样的话元素个数越多copy就越多,性能也就越差。

但他的插入性能也不是一定不如Linkedlist,因为只要合理的安排容量,采用的是尾插法,在尾部插入元素就可以极大的提高性能,这样他的性能甚至可以超过Linkedlist。这也算是一种隐藏的契机吧。因为Linkedlist虽然说插入元素很方便只需要断开重新连接一下,但是Linkedlist里维护了一个node内部类,每插入一个元素都会创建一个node对象,如果是大量数据进行插入的话就要创建大量的node对象,他的性能消耗就很大,而ArrayList不需要额外的创建对象。所以使用得当的话ArrayList的插入性能不一定差。
但是一定要注意初始容量的合理性。初始容量指定太大的话就会占用不必要的内存。

一般也不建议使用Linkedlist的原因

因为遍历的时候Linkedlist必须使用迭代器,不适用for循环,就算用for循环他的效率也会非常的低。如果用for循环获取某一元素,在查找下标时需要一个一个遍历,性能消耗大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值