首页 > 编程语言 >ArrayList源码

ArrayList源码

时间:2022-11-30 16:02:01浏览次数:34  
标签:int ArrayList elementData newCapacity private minCapacity 源码 EMPTY

//属性
//默认初始大小
private static final int DEFAULT_CAPACITY = 10;
//空数组用这个
private static final Object[] EMPTY_ELEMENTDATA = {};
//扩展数组时用来和EMPTY_ELEMETDAT
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
//添加第一个元素时将会扩大多DEFAULT_CAPACITY
transient Object[] elementData;
//数组大小
private int size;

构造函数:

    public ArrayList(int initialCapacity) {
        // 初始容量大于0,数组大小就是这么多
        if (initialCapacity > 0) {
            this.elementData = new Object[initialCapacity];
        } else if (initialCapacity == 0) {
            // 如果为0,为已经设置的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() {
        // 与EMPTY_ELEMENTDATA区分开
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }

扩容机制:

// 确保容量足够
public void ensureCapacity(int minCapacity) {
    int minExpand = (elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
        // any size if not default element table
        ? 0
        // larger than default for default empty table. It's already
        // supposed to be at default size.
        : DEFAULT_CAPACITY;

    if (minCapacity > minExpand) {
        ensureExplicitCapacity(minCapacity);
    }
}

如果elementData不是DEFAULTCAPACITY_EMPTY_ELEMENTDATA,就给minExpand赋值0,否则就是10;如果minCapacity > minExpand,进行精确确保容量

private void ensureExplicitCapacity(int minCapacity) {
    //修改次数
    modCount++;

    // overflow-conscious code
    if (minCapacity - elementData.length > 0)
        grow(minCapacity);
}

如果最小容量比数组长度大就扩容

// 尝试分配最大的数组大小,防止OutOfMemoryError
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
private void grow(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    // minCapacity is usually close to size, so this is a win:
    elementData = Arrays.copyOf(elementData, newCapacity);
}
private static int hugeCapacity(int minCapacity) {
    if (minCapacity < 0) // overflow
        throw new OutOfMemoryError();
    return (minCapacity > MAX_ARRAY_SIZE) ?
        Integer.MAX_VALUE :
        MAX_ARRAY_SIZE;
}

可以看到newCapacity的大小是oldCapacity的1.5倍,如果newCapacity还是小于minCapacity,newCapacity = minCapacity;如果newCapacity已经比最大容量大了,就调用hugeCapacity方法,就直接把整数最大值赋给newCapacity;最后一步调用copyOf复制新数组

标签:int,ArrayList,elementData,newCapacity,private,minCapacity,源码,EMPTY
From: https://www.cnblogs.com/xiaoovo/p/16937180.html

相关文章

  • vue2源码分析- 数据响应简单模拟
    工作中大部分项目使用vue2做,但一直局限于使用,终于有闲暇时间可以学习下源码,网上优秀的源码分析很多,此文章只是记录个人所学,有问题欢迎大家指出,欢迎讨论,互相学习。下面是我......
  • 基于SpringBoot+Layui的物业管理系统【完整项目源码】
    使用建议业务逻辑简略,需要细化业务,增加业务开发,如未交费提醒等技术架构数据库:MySQL8.X后端技术:SpringBoot2.3.0,MyBatisPlus数据连接池:Druid前端技术:La......
  • HashMap源码分析(一)
    之前有写到ArrayList的源码分析,欢迎大家点开我的头像查看对于HashMap这个类大家一定不陌生,想必多多少少用过或者了解过,今天我来和大家谈谈HashMap的源码,JDK为1.8继承Abs......
  • ArrayList的源码分析(一)
    我想大家既然能看到这篇文章我就不用解释Arraylist是啥了,简单点说就是一个动态对象数组,然后就这个集合的源代码拿出来给大家分析一下我的个人看法和收获,实例代码是jdk1.8......
  • ArrayList的源码分析(二)
    上篇文章给大家介绍了arraylist集合源码的一些属性和扩容方式add方法,接下来再和大家来聊聊这个集合的一些源码首先看看remove的方法,这个方法有两个,一个是根据下标删除对......
  • Mybatis源码分析(十五) - 缓存技术
    MyBatis包含一个非常强大的查询缓存特性,使用缓存可以使应用更快地获取数据,避免频繁的数据库交互 缓存查询图: 一级缓存(也叫应用缓存)一级缓存默认会启用,想要关闭一级缓存......
  • Mybatis源码分析(十三) - 关联查询之多对多
    我的理解是,多对多其实就是两个一对多。嵌套结果:示例代码:<selectid="selectUserRole"resultMap="userRoleInfo">selecta.id,a.user_name,a.real......
  • Mybatis源码分析(十四) - discriminator 鉴别器映射
    在特定的情况下使用不同的pojo进行关联,鉴别器元素就是被设计来处理这个情况的。鉴别器非常容易理解,因为它的表现很像Java语言中的switch语句discriminator标签常用的......
  • Mybatis源码分析(十七) - 源码包分析【日志模块】
    mybatis源码下载地址:​​https://github.com/mybatis/mybatis-3​​MyBatis源码导入过程:下载MyBatis的源码检查maven的版本,必须是3.25以上,建议使用maven的最新版本mybatis的......
  • Mybatis源码分析(二十一) - 核心流程分析
    mybatis核心流程三大阶段初始化阶段读取XML配置文件和注解中的配置信息,创建配置对象,并完成各个模块的初始化的工作代理阶段封装iBatis的编程模型,使用mapper接口开发的初始化......