android的ArrayList和LinkedList的应用场景和源码分析

本文深入分析ArrayList和LinkedList在Java中的应用场景、性能特点和源码细节。ArrayList基于数组,适合随机访问,但插入删除效率较低;LinkedList采用链表结构,插入删除高效,但随机访问性能较差。通过源码解读,进一步阐述两者在构造、添加、插入、删除和获取元素等操作上的区别。
摘要由CSDN通过智能技术生成

简介

ArrayList和LinkedList都是AbstractList的子类,都实现了List接口。而且都是日常开发中最常用的List。但是实话实说,在之前的很长一段时间的开发里,我涉及到list都是用arraylist去实现的。以至于在很长一段时间里,我完全不知道LinkedList的存在,以为list只有ArrayList这一个实现方法。

但是实际上,一切list都用arraylist是非常不合理的,虽然可以满足需求,但是在部分情况下,会非常影响性能。所以我们需要明白在什么场景下,应该用什么样的实现类。所以也就有了这篇文章,我们从原理上分析,ArrayList和LinkedList的异同。

结论

原谅我,还没有看源码就下结论了。但是对于很多小伙伴们来说,其实知道结论就够了。所以我就暂且把结论放在最前面了。

ArrayList: 底层由数组提供支持。有非常好的随机读写能力,但是对于在数组中间插入和移除数据较慢。
LinkedList: 底层由链表提供支持。对于列表中间移除和插入数据速度非常快,并且不存在扩容问题。但是随机读写能力较弱。

源码分析

构造函数

ArrayList

  transient Object[] array;

    /**
     * Constructs a new {@code ArrayList} instance with zero initial capacity.
     */
    public ArrayList() {
    	//无参构造函数,新建一个空数组
        array = EmptyArray.OBJECT;
    }

LinkedList


	//transient 修饰的变量不参与序列化
    transient Link<E> voidLink;

    private static final class Link<ET> {
        ET data; //保存的数据

        //previous指向上一个数据,next指向下一个数据。双向链表的必备
        Link<ET> previous, next; 

        Link(ET o, Link<ET> p, Link<ET> n) {
            data = o;
            previous = p;
            next = n;
        }
    }

    public LinkedList() {
    	//构建一个空的链表,这里的voidLink 上一个指向自己,下一个也指向自己
        voidLink = new Link<E>(null, null, null);
        voidLink.previous = voidLink;
        voidLink.next = voidLink;
    }

add方法

ArrayList

    /**
     * Adds the specified object at the end of this {@code ArrayList}.
     *
     * @param object
     *            the object to add.
     * @return always true
     */
    @Override public boolean add(E object) {
        Object[] a = array;
        int s = size; //当前L
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值