ArrayList和LinkedList的区别

ArrayList和LinkedList都实现了List接口,但是它们有以下不同点:

底层数据结构:ArrayList是基于索引(index)的数据结构,它的底层是数组,它可以以O(1)时间复杂度进行随机访问。与此对应,LinkedList是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是O(n)。
对元素的操作:相对于ArrayList,LinkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或是更新索引(除了插入在数组的尾部),也不需要在数组装满的时候要将所有的数据重新装入一个新的数组,这也是ArrayList最坏的一种情况,这样做的时间复杂度为O(n),而LinkedList中插入或删除的时间复杂度仅为O(1)。删除类似于此。相对应的,ArrayList的查找操作要优于LinkedList
所占内存大小:LinkedList比ArrayList更占内存,因为ArrayList的每个索引的位置是实际的数据,而LinkedList中的每个节点中存储的是实际的数据和前后节点的位置(一个LinkedList实例存储了两个值:Node<E> first和Node<E> last 分别表示链表的起始节点和尾结点,每个Node实例存储了三个值:E item;Node next;Node pre)。

什么场景下更适宜使用LinkedList,而不用ArrayList

1. 你的应用不会随机访问数据。因为如果你需要LinkedList中的第n个元素的时候,你需要从第一个元素顺序数到第n个数据,然后读取数据。
2. 你的应用更多的插入和删除元素,更少的读取数据。因为插入和删除元素不涉及重排数据,所以它要比ArrayList要快

ArrayList常用的方法
1)add(element) 添加一个元素,
2)add(index , element) 在index位置添加一个元素 index当前元素就会往后挪
3)size() 顺序表长度
4) set(index ,element) 将index位置元素进行修改
5)get(index) 获取index位置的元素
6)remove(index) 删除index 位置的元素
7)contains(element) 是否包含该元素
8)isEmpry() 判断顺序表是否为空

LinkedList常用的方法
1)add(element ) 添加一个元素
2)addFirst(element) 头插一个元素
3)addLast(element) 尾插一个元素
4)get(index) 获取index 位置的元素
5)set(index,element) 设置index位置元素为 element
6)indexOf(element) 返回该元素所在下标,没找到就返回-1
7)contains (element) 判断是否有该元素

ArrayList 的扩容机制
总体来说就是把数组复制到另外一个内存空间更大的数组中
若只是创建了对象没有添加元素,此时的大小为0,如果我们没有指定大小,此时默认大小为10
扩容时机
如果当前数组大小大于数组初识容量(比如初识容量为10,当添加第11个元素时)就会进行扩容,新的容量为旧的容量的1.5倍
扩容方式
扩容时,会以新的容量创建一个原数组的拷贝,将原数组的数据拷贝过来,原数组就会被抛弃,会被GC回收

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赚钱去流浪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值