ArrayList底层结构和源码分析

本文详细介绍了ArrayList的内部结构,包括其属性、构造器和方法。重点探讨了ArrayList的扩容机制,指出默认容量为10,之后每次扩容为原容量的1.5倍。同时,解析了`add()`方法和`grow()`方法的实现细节,展示了如何在ArrayList中添加元素并调整数组大小。
摘要由CSDN通过智能技术生成


一、ArrayList结构

在这里插入图片描述

1 属性

在这里插入图片描述

2 构造器

在这里插入图片描述

3 方法

在这里插入图片描述

在这里插入图片描述

二、原理概述

1.ArrayList中维护了一个Object类型的数组elementData

2.new ArrayList()时

  • 如果使用的是无参构造器,则初始elementData容量为0,是一个空数组;当第一次添加元素的时候,才会第一次扩容为10(静态常量),如需要再次扩容时,则扩容elementData为1.5倍,变成 1.5 * 10
  • 如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如果需要扩容则扩容elementData为1.5倍,变成 1.5 * 初始化大小

三、相关代码解读

1 add()

 public boolean add(E e) {
 	 // 先校验elementData数组是否需要扩容
 	 // 是--->对数组进行扩容;否---->无需扩容
     ensureCapacityInternal(size + 1); 
     // 添加元素
     elementData[size++] = e;
     //返回true
     return true;
 }

2 grow()

private void grow(int minCapacity) {
    // oldCapacity  = 当前数组长度
    int oldCapacity = elementData.length;
    // newCapacity = 原数组长度 + 1/2 * 原数组长度
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    // 数组拷贝
    elementData = Arrays.copyOf(elementData, newCapacity);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值