Java中ArrayList和LinkedList的区别

Java中ArrayList和LinkedList的区别

底层实现:

ArrayList底层是数组结构,元素在内存中是连续存储的,默认容量是10.(在添加元素时超过容量也不会报出异常,因为会自动扩容)。

LinkedList底层是双向链表结构,元素在内存中是非连续存储,每个元素了指向前一个和后一个元素的指针。

注意:这两者线程都是不安全的,如果在多线程的环境下操作,需要外部同步。

插入/删除数据的方式:

ArrayList是需要将添加/删除元素后面的所有元素向后/前移动一位,除了要操作元素本身位置的数据,还需要对集合中的其他元素进行重新位置的排序,时间复杂度为O(n).

LinedList可以从头部进行添加也可以从尾部进行添加,只需要修改插入/删除元素前后的两个指针,时间复杂度为O(1),所以根据数据结构来讲的话,插入和删除操作LinkedList要比ArrayList效率高。

添加元素的效率:

ArrayList在不改变容量的情况下,增加元素比LinkedList要快。但如果改变容量的情况下,LinkedList要比ArrayList增加元素要快。(因为ArrayList要要扩容,所谓扩容也就是增加容量)

查询效率:

ArrayList:如果是根据角标去查询的话,是可以通过角标直接获取元素,时间复杂度为o(1)

LinkedList:需要从头部或者是尾部进行二分遍历来查找指定元素,时间复杂度为o(n)

注意:如果根据角标去查询数据的话,ArrayList要比LinkedList效率要高,如果不能根据角标去查询数据的话,两个都是通过遍历查询数据,所以效率都低。

内存占用:

ArrayList是需要预留空间,默认容量是10,所以相对于LinkedList来讲内存占用比较高。

LinkedList是不需要预留空间,所以内存占用比较低。

使用场景:

ArrayList:适用于对插入和删除操作要求不高的场景,可以进行随机访问跟修改操作。由于ArrayList是基于数组实现的,所以或需要存储大量数据时,它在内存使用上更高效。

LinkedList:适用于对随机访问要求不高的场景(即不需要通过索引访问元素),而是经常在链表头部或尾部进行操作,可以进行频繁地插入和删除操作。

(我理解的是这样的,可能有的我理解的也是错的,可以提出建议)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值