ArrayList和LinkedList的简介,以及对比

恩,由于面向面试所以比较简洁。

基于链表实现的方式使得 LinkedList 在插入和删除时更优于 ArrayList,而随机访问则比 ArrayList 逊色些。ArrayList不适合在具体的index下插入元素,那样需要移动数组。


ArrayList

动态数组,初始长度可以通过构造函数设定,默认为10(jdk1.6以后),允许null值。

ArrayList相当于在没指定initialCapacity时就是会使用延迟分配对象数组空间,当第一次插入元素时才分配10(默认)个对象空间。假如有20个数据需要添加,那么会分别在第一次的时候,将ArrayList的容量变为10;之后扩容会按照1.5倍增长。也就是当添加第11个数据的时候,Arraylist继续扩容变为10*1.5=15;当添加第16个数据时,继续扩容变为15 * 1.5 =22个。:

插入一个元素时数组大小为10
这里写图片描述

插入10个元素时数组大小还为10
这里写图片描述

插入11个元素时数组大小变为15
这里写图片描述

每次扩容都是通过Arrays.copyOf(elementData, newCapacity) 这样的方式实现的。在构造 ArrayList 时可以给 ArrayList 指定一个初始容量,这样就会减少扩容时数据的拷贝问题。当然在添加大量元素前,应用程序也可以使用 ensureCapacity 操作来增加 ArrayList 实例的容量,这可以减少递增式再分配的数量

为什么每次扩容处理会是 1.5 倍,而不是 2.5、3、4 倍呢?通过 google 查找,发现 1.5 倍的扩容是最好的倍数。因为一次性扩容太大(例如 2.5 倍)可能会浪费更多的内存(1.5 倍最多浪费 33%,而 2.5 被最多会浪费 60%,3.5 倍则会浪费 71%……)。但是一次性扩容太小,需要多次对数组重新分配内存,对性能消耗比较严重。所以 1.5 倍刚刚好,既能满足性能需求,也不会造成很大的内存消耗。

线程不安全

LinkedList

同样实现List接口,不过底层是链表实现的。
双端链表,适合添加删除操作。不适合查找,尤其是远离两头的元素。
不是线程安全的,这里就不展开了
常用方法

  • get(int index):返回此列表中指定位置处的元素。
  • getFirst():返回此列表的第一个元素。
  • getLast():返回此列表的最后一个元素。
  • indexOf(Object o):返回此列表中首次出现的指定元素的索引,如果此列表中不包含该元素,则返回 -1。
  • lastIndexOf(Object o):返回此列表中最后出现的指定元素的索引,如果此列表中不包含该元素,则返回 -1。

参考链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抱歉,我无法提供思维导图。但我可以为你总结arraylistlinkedlist的一些关键特点。 ArrayListLinkedList都是Java中的集合类,用于存储和操作一组对象。然而,它们的实现方式和性能特点有所不同。 ArrayList的底层使用Object[]数组来实现,它可以根据索引随机访问元素。由于数组的连续内存分配,ArrayList在随机访问和尾部插入元素方面具有很好的性能。然而,插入和删除元素时,ArrayList需要移动其他元素以保持连续的内存空间,因此性能较差。 LinkedList的底层使用链表来实现,每个元素都包含一个指向前一个和后一个元素的引用。由于链表的非连续内存分配,LinkedList在插入和删除元素时具有较好的性能,因为只需要修改前后元素的引用。然而,由于需要遍历链表来访问元素,LinkedList在随机访问方面性能较差。 综上所述,ArrayList适用于需要频繁随机访问元素的场景,而LinkedList适用于需要频繁插入和删除元素的场景。选择哪种集合类取决于你的具体需求和对性能的要求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Java基础(一)-ArrayListLinkedList性能对比与原因探索](https://blog.csdn.net/weixin_44212764/article/details/123573370)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [ArrayListLinkedList实现原理](https://blog.csdn.net/m0_67402564/article/details/123499751)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值