首页 > 编程语言 >ArrayList源码分析

ArrayList源码分析

时间:2022-09-27 11:01:19浏览次数:51  
标签:分析 index int ArrayList elementData minCapacity 数组 长度 源码

ArrayList源码分析

默认大小

// 根据传入的初始化大小创建对应的数组大小
public ArrayList(int initialCapacity) {
    if (initialCapacity > 0) {
        // 根据传入的值、创建对应的Object数组
        this.elementData = new Object[initialCapacity];
    } else if (initialCapacity == 0) {
        // 为0则赋值一个空的Object数组
        this.elementData = EMPTY_ELEMENTDATA;
    } else {
        // 传入的值错误
        throw new IllegalArgumentException("Illegal Capacity: "+
                                           initialCapacity);
    }
}

private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

public ArrayList() {
    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

如果不传入初始化大小的话、则默认的大小为一个空的Object数组

扩容机制

// 直接往数组尾部添加元素
public boolean add(E e) {
    // modCount线程安全相关检查、以及扩容机制的具体操作
    ensureCapacityInternal(size + 1); 
    // 往数组尾部添加、即数组长度、添加完后在自增
    elementData[size++] = e;
    return true;
}

// 根据索引往数组插入元素
public void add(int index, E element) {
    // 索引检查
    rangeCheckForAdd(index);

    // modCount线程安全相关检查、以及扩容机制的具体操作
    ensureCapacityInternal(size + 1);
    
    // 数组拷贝、在要插入的索引位置把数组向右移动一位、然后在给索引位置赋值
    System.arraycopy(elementData, index, elementData, index + 1,
                     size - index);
    elementData[index] = element;
    // 数组长度自增
    size++;
}

// 确保集合容量、传入现在需要的数组长度大小
private void ensureCapacityInternal(int minCapacity) {
    ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}

// 里面调用了扩容操作、传入的是当前数组需要的最小长度
private void ensureExplicitCapacity(int minCapacity) {
    // 线程安全相关
    modCount++;
	
   	// 当前数组需要的长度大于当前数组长度时、执行扩容
    if (minCapacity - elementData.length > 0)
        // 执行数组扩容操作、根据传入的长度扩容几倍的数组大小
        grow(minCapacity);
}

// 计算一下扩容的大小、传入当前数组和当前需要的长度
private static int calculateCapacity(Object[] elementData, int minCapacity) {
    // 如果数组是默认的空数组、则返回默认为10的长度、不是的话返回当前需要的长度
    if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
        return Math.max(DEFAULT_CAPACITY, minCapacity);
    }
    return minCapacity;
}

private void grow(int minCapacity) {
    // 当前数组长度
    int oldCapacity = elementData.length;
    // 新的数组长度 = 需要的数组长度 + 需要的数组长度 / 2
    int newCapacity = oldCapacity + (oldCapacity >> 1);

    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    // 扩容数组、拷贝一个新的数组返回、根据newCapacity长度
    elementData = Arrays.copyOf(elementData, newCapacity);
}

索引检查

// 索引检查
private void rangeCheckForAdd(int index) {
    if (index > size || index < 0)
        throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}

标签:分析,index,int,ArrayList,elementData,minCapacity,数组,长度,源码
From: https://www.cnblogs.com/tie-dao/p/16733801.html

相关文章

  • 智能分析网关基于AI烟火识别技术的消防预警方案
    AI烟火识别是基于深度学习神经网络技术和视频智能分析的一项实用性技术,通过对监控区域内的烟雾和火焰进行精准检测与识别,并实时预警,有效协助工作人员及时处理消防危机。......
  • 分析服务器日志常用命令
    1、查看有多少个IP访问:awk '{print $1}' log_file|sort|uniq|wc-l2、查看某一个页面被访问的次数:grep "/index.php" log_file|wc-l3、查看每一个IP访问了多少......
  • 【SQLServer】如何分析图形化的SQL执行计划
    1.【SQLServer】SQLServer执行计划概览2.【SQLServer】SQLServer执行计划的类型 SQL执行计划广泛用于通过监视和排除查询内部执行的方式来调整查询的性能。为了能够利......
  • 线程池底层原理详解与源码分析
    【1】为什么要使用线程池?示例演示://设置业务模拟classMyRunnableimplementsRunnable{privateintcount;publicMyRunnable(intcount){......
  • 【机器学习】数值分析03——任意曲线拟合
    数值分析<3>——任意曲线拟合全文目录(博客园)机器学习(Github)MachineLearningMath万物皆是展开式你是否想过这样一个问题,任何的函数,也许都能通过一个“大一统”理论将......
  • 实验3:OpenFlow协议分析实践
    实验3:OpenFlow协议分析实践一、实验目的能够运用wireshark对OpenFlow协议数据交互过程进行抓包;能够借助包解析工具,分析与解释OpenFlow协议的数据包交互过程与机制......
  • 实验3:OpenFlow协议分析实践
    基本要求一、拓扑文件二、Wireshark抓包结果1.hello控制器6633端口--->交换机34614端口交换机34614端口--->控制器6633端口2.FeaturesRequest控制器6633端......
  • 实验3:OpenFlow协议分析实践
    一、实验目的1.能够运用wireshark对OpenFlow协议数据交互过程进行抓包;2.能够借助包解析工具,分析与解释OpenFlow协议的数据包交互过程与机制。二、实验环境Ubuntu......
  • [数值分析]牛顿迭代法Newton!!!
    牛顿迭代法Newton!!!牛顿迭代法的基本思想牛顿迭代法是一种用来求解方程的方法,它的基本思想是:如果一个函数在某一点的切线是直线,那么迭代下一次产生的值就是切线与x轴的......
  • 实验3:OpenFlow协议分析实践
    一.实验目的1.能够运用wireshark对OpenFlow协议数据交互过程进行抓包;2.能够借助包解析工具,分析与解释OpenFlow协议的数据包交互过程与机制。二.实验环境Ubuntu......