ArrayList源码分析(入门篇)

简介: ArrayList源码分析(入门篇)

ArrayList源码分析

前言:


写这篇博客的主要原因是,在我上一次参加千牵科技Java实习生面试时,有被面试官问到ArrayList为什么查找的速度较快,插入和删除的速度较慢?当时我回答得不好,很大的一部分原因是因为我没有阅读过ArrayList源码,虽然最后收到Offer了,但我拒绝了,打算寒假学得再深入些再广泛些,下学期开学后再去投递其他更好的公司。为了更加深入理解ArrayList,也为了在面试中占据更多的优势,我写下这篇博客。


基本认识

1.概念:

ArrayList是一个其容量能够动态增长的动态数组。但是他又和数组不一样,下面会分析对比。它继承了AbstractList,实现了List、RandomAccess, Cloneable, java.io.Serializable.

2.继承关系:

2020020708583152.png


可以清晰地看到,ArrayList的继承关系

那么它继承的这些类、实现的这些接口对于它的特性有什么作用或意义呢?


ArrayList 继承了AbstractList,实现了List。它是一个数组队列,提供了相关的添加、删除、修改、遍历等功能

ArrayList 实现了RandmoAccess接口,即提供了随机访问功能。

ArrayList 实现了Cloneable接口,即重写了函数clone(),能被克隆

ArrayList 实现了java.io.Serializable接口,这意味着ArrayList支持序列化,能通过序列化去传输

和Vector不同,ArrayList中的操作不是线程安全的!所以,建议在单线程中才使用ArrayList,而在多线程中可以选择Vector或者CopyOnWriteArrayList。


属性

 //序列化ID
 private static final long serialVersionUID = 8683452581122892189L;
    /**
     * Default initial capacity.默认初始化大小为10
     */
    private static final int DEFAULT_CAPACITY = 10;
    /**
     * Shared empty array instance used for empty instances. 为一个空对象提供的空数组
     */
    private static final Object[] EMPTY_ELEMENTDATA = {};
    /**
     * Shared empty array instance used for default sized empty instances. We
     * distinguish this from EMPTY_ELEMENTDATA to know how much to inflate when
     * first element is added.
     *  为一个空对象提供的空数组,内容为{}
     */
    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
    /**
     * The array buffer into which the elements of the ArrayList are stored.
     * The capacity of the ArrayList is the length of this array buffer. Any
     * empty ArrayList with elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA
     * will be expanded to DEFAULT_CAPACITY when the first element is added.
     * 当前数据对象存放地方,当前对象不参与序列化
     */
    transient Object[] elementData; // non-private to simplify nested class access
    /**
     * The size of the ArrayList (the number of elements it contains).
     * 当前数组长度,即数组中包含元素的个数
     * @serial
     */
    private int size;

构造方法

/**
     * Constructs an empty list with the specified initial capacity.
     * 构造一个初始容量为initialCapacity的空列表
     * @param  initialCapacity  the initial capacity of the list
     * @throws IllegalArgumentException if the specified initial capacity
     *         is negative
     */
    public ArrayList(int initialCapacity) {
        if (initialCapacity > 0) {
        //初始化一个大小为initialCapacity的数组
            this.elementData = new Object[initialCapacity];
        } else if (initialCapacity == 0) {
        //初始化一个数组Object[] EMPTY_ELEMENTDATA = {};
            this.elementData = EMPTY_ELEMENTDATA;
        } else {
        //抛出异常
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        }
    }
    /**
     * Constructs an empty list with an initial capacity of ten.
     */
    public ArrayList() {
    //初始化一个默认的 DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}数组,即空数组
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }
    /**
     * Constructs a list containing the elements of the specified
     * collection, in the order they are returned by the collection's
     * iterator.
     * 将集合数组化,并将其拷贝给ArrayList数组
     * @param c the collection whose elements are to be placed into this list
     * @throws NullPointerException if the specified collection is null
     */
    public ArrayList(Collection<? extends E> c) {
        elementData = c.toArray();
        if ((size = elementData.length) != 0) {
            // c.toArray might (incorrectly) not return Object[] (see 6260652)
            if (elementData.getClass() != Object[].class)
                elementData = Arrays.copyOf(elementData, size, Object[].class);
        } else {
            // replace with empty array.
            this.elementData = EMPTY_ELEMENTDATA;
        }
    }
相关文章
|
负载均衡 网络协议 数据库
部署 Windows 域(二)
部署 Windows 域(二)
561 0
|
3月前
|
消息中间件 算法 调度
外卖配送系统搭建方法核心:调度算法与任务分配机制实现思路
外卖配送系统的核心不在页面,而在调度算法。本文详解如何构建高效调度体系:从基础距离匹配、加权评分模型,到批量订单优化与微服务架构,涵盖数据模型、代码实现与生产实践,揭示智能调度才是决定履约效率与平台竞争力的关键壁垒。(239字)
|
2月前
|
人工智能 自然语言处理 安全
5 分钟搭建 OpenClaw 本地 AI 智能体全流程
OpenClaw(小龙虾)是GitHub星标超28万的本地AI智能体,支持Windows一键部署:零代码、全自动、内置所有依赖。5分钟即可完成安装,无需配环境,数据完全本地化,安全可靠。可自动执行文件整理、办公自动化、浏览器操作等任务,真正实现“听指令、自动干”。
|
3月前
|
存储 SQL 关系型数据库
MySQL 索引底层彻底吃透:B + 树原理、聚簇索引机制与全场景优化指南
本文深入剖析MySQL InnoDB索引底层原理:从B+树为何成为最优选,到聚簇/二级索引机制、回表与覆盖索引;详解最左前缀、索引失效10大场景及根因;并给出分页优化、联合索引设计、ICP等生产级实战方案,助你真正知其所以然。
468 2
|
9月前
|
机器学习/深度学习 边缘计算 数据可视化
MyEMS 深度解析:碳管理赋能与系统集成的实践路径
MyEMS 是一款集碳管理与能源优化于一体的开源系统,具备多标准碳核算、碳足迹可视化、碳成本分析等功能,助力企业实现精准碳减排。系统支持与工业、建筑、政务平台等多系统集成,打破数据孤岛,提升能效。依托活跃的开源社区与丰富实践案例,MyEMS 持续迭代,推动绿色转型。
551 1
|
12月前
|
存储 监控 安全
电商API安全指南:保护数据与防止欺诈的最佳实践
在电商领域,API安全至关重要。本文从基础到实践,全面解析电商API安全策略:通过强认证、数据加密、输入验证及访问控制保护敏感数据;借助速率限制、欺诈检测与行为分析防范恶意行为。同时,强调将安全融入开发生命周期,并提供应急计划。遵循最佳实践,可有效降低风险,增强用户信任,助力业务稳健发展。
|
JavaScript
vue3中watch的用法及讲解
vue3中watch的用法及讲解
|
存储 分布式计算 资源调度
hadoop确认格式化的方法
【7月更文挑战第21天】
610 5
|
前端开发 安全 测试技术
逆向海淘代购集运系统客户案例:superbuy淘宝代购集运系统丨1688代采系统搭建攻略
搭建Superbuy淘宝代购及1688代采系统涉及定位分析、技术选型、API集成、支付物流、用户体验及安全部署。采用PHP、MVC架构,集成多平台商品、支付方式,确保数据同步与安全。1688代采系统着重商品代采、订单管理与物流跟踪,通过自动化流程提升效率。全面测试确保系统稳定可靠。
|
Java 编译器
Java面向对象(三)详解: 封装 | 继承 | 方法重写 | 抽象类
Java面向对象(三)详解: 封装 | 继承 | 方法重写 | 抽象类
342 2