List

Arraylist 与 LinkedList 区别

是否保证线程安全

  • ArrayListLinkedList 都是不同步的,也就是不保证线程安全

底层数据结构

  • Arraylist 底层使用的是 Object 数组
  • LinkedList 底层使用的是 双向链表 数据结构(JDK1.6之前为循环链表,JDK1.7取消了循环)

插入和删除

  • ArrayList的插入和删除
    • 如果插入和删除操作是发生在数组的尾部,这种情况时间复杂度就是O(1)
    • 如果插入和删除操作不是发生在数组的尾部,时间复杂度就为 O(n-i),因为在进行上述操作的时候集合中第 i 和第 i 个元素之后的(n-i)个元素都要执行向后位/向前移一位的操作
  • LinkedList 的插入和删除,
    • 如果插入和删除操作是发生在数组的尾部或者头部,这种情况时间复杂度就是O(1)
    • 如果插入和删除操作不是发生在数组的尾部或者头部, 时间复杂度近似为o(n))因为需要先移动到指定位置再插入

是否支持快速随机访问

  • LinkedList 不支持高效的随机元素访问,而 ArrayList 支持
  • 快速随机访问就是通过元素的序号快速获取元素对象(对应于get(int index)方法)

内存空间占用

  • ArrayList的空间浪费主要体现在在list列表的结尾会预留一定的容量空间
  • LinkedList的空间花费则体现在它的每一个元素都需要消耗比ArrayList更多的空间(因为要存放直接后继和直接前驱以及数据

RandomAccess接口

public interface RandomAccess {
}

查看源码我们发现实际上 RandomAccess 接口中什么都没有定义。所以,在我看来 RandomAccess 接口不过是一个标识罢了。标识什么? 标识实现这个接口的类具有随机访问功能。

binarySearch()方法中,它要判断传入的list 是否 RamdomAccess 的实例,如果是,调用indexedBinarySearch()方法,如果不是,那么调用iteratorBinarySearch()方法

    public static <T>
    int binarySearch(List<? extends Comparable<? super T>> list, T key) {
        if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD)
            return Collections.indexedBinarySearch(list, key);
        else
            return Collections.iteratorBinarySearch(list, key);
    }

ArrayList 实现了 RandomAccess 接口, 而 LinkedList 没有实现。为什么呢?我觉得还是和底层数据结构有关!ArrayList 底层是数组,而 LinkedList 底层是链表。数组天然支持随机访问,时间复杂度为 O(1),所以称为快速随机访问。链表需要遍历到特定位置才能访问特定位置的元素,时间复杂度为 O(n),所以不支持快速随机访问。,ArrayList 实现了 RandomAccess 接口,就表明了他具有快速随机访问功能。 RandomAccess 接口只是标识,并不是说 ArrayList 实现 RandomAccess 接口才具有快速随机访问功能的!

list 的遍历方式选择

  • 实现了 RandomAccess 接口的list,优先选择普通 for 循环 ,其次 foreach,
  • 未实现 RandomAccess接口的list,优先选择iterator遍历(foreach遍历底层也是通过iterator实现的),大size的数据,千万不要使用普通for循环

ArrayList 与 Vector 区别

  • Vector类的所有方法都是同步的。可以由两个线程安全地访问一个Vector对象、但是一个线程访问Vector的话代码要在同步操作上耗费大量的时间
  • Arraylist不是同步的,所以在不需要保证线程安全时建议使用Arraylist

ArrayList 的扩容机制

  • 无参创建,先创建一个空数组,当加入第一个元素的时候,扩容长度为10
  • 每次扩容长度为 size + size >> 1(1.5倍)
  • 使用System.arraycopy()进行元素复制
    详见笔主的这篇文章:通过源码一步一步分析ArrayList 扩容机制
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

发财猪猪

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

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

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

打赏作者

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

抵扣说明:

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

余额充值