集合-ArrayList学习

ArrayList在Java中是一个动态数组,初始长度为0,首次插入元素时扩容至10。随着元素增加,数组会按1.5倍扩容。添加元素时,通过ensureCapacityInternal等方法检查并调整容量。整个过程涉及到calculateCapacity和grow方法,保证空间管理效率。ArrayList不是线程安全的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、特点:

  • ArrayList 实现是一个动态数组,初始时是一个空数组。
  • ArrayList 默认初始长度为0,在插入第一个元素的时候扩容为10,然后当数组存满的时候,数组会再次扩容,此时就扩容到原来的1.5倍。
  • ArrayList 是线程不安全的。

2、分析:

2.1、创建一个ArrayList
ArrayList<String> list = new ArrayList<>();

按住Ctrl点击ArrayList<>() 进去我们可以看到,这是啥意思呢?

首先要明白this 是啥意思,其实此时this 就代表的是 ArrayList 。你在main中创建的ArrayList 其实就是一个空数组。在这里插入图片描述

elementData 是声明了一个object类型的数组

在这里插入图片描述

DEFAULTCAPACITY_EMPTY_ELEMENTDATA 也是一个object类型的数组,这个数组是空的。

也就是说此时的数组长度是0

在这里插入图片描述

2.2、添加一个元素
list.add("12346");

按住Ctrl点击add,然后看到ArrayList 中的add方法。在调用add 方法时,它首先调用了ensureCapacityInternal 方法 ,然后把元素放进elementData 数组中,然后size++ 之后返回一个布尔值。

在这里插入图片描述

ensureCapacityInternal 方法是干嘛呢?

它首先调用了calculateCapacity 传递了数组和数组的长度,然后调用了ensureExplicitCapacity

在这里插入图片描述

calculateCapacity 方法是干嘛呢?

它首选判断当前的数组是不是空数组,也就是是不是第一次插入元素。如果是就比较DEFAULT_CAPACITYminCapacity 谁大就返回谁,DEFAULT_CAPACITY = 10minCapacity = 1 显然DEFAULT_CAPACITY 大也就把数组初始为10了。

如果不是空数组就直接返回当前数组的长度

在这里插入图片描述

ensureExplicitCapacity 方法是干嘛的呢?

它就是判断当前数组的元素个数是否大于数组的长度,如果大于就调用grow

在这里插入图片描述

grow 方法的作用
首先把数组的长度,赋值给oldCapacity 然后定义一个新的长度,让这个长度等于 旧的长度的1.5倍 ,之后判断此时的长度是否小于最小长度,如果小于就让把它的值重新赋值为最小长度。不然就判断此时的长度是否大于最大长度。如果大于就调用hugeCapacity 方法,并把返回的值赋给新的数组长度,然后把旧的数组元素,按照新的长度,复制给新的数组。 此时就完成了扩容

在这里插入图片描述

hugeCapacity 方法的作用
如果这个最小值小于0 就抛出错误,否则就判断它是否大于ArrayList 定义的默认最大长度,如果大于就返回 int类型的最大长度,否则就返回 arrayList 定义的默认最大长度 给到newCapacity

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值