Java6集合类源码解读-----ArrayList中一个有趣的变量oldData

本文深入探讨了Java ArrayList的ensureCapacity方法,解释了该方法如何确保ArrayList有足够的容量来存储元素,并详细分析了局部变量oldData的作用及其对内存管理的重要性。

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

在阅读Java6 集合类源码ArrayList中遇到了这样一个方法:

ArrayList.java
public void ensureCapacity(int minCapacity) {
modCount++;
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
     Object oldData[] = elementData;
     int newCapacity = (oldCapacity * 3)/2 + 1;
          if (newCapacity < minCapacity)
               newCapacity = minCapacity;
               elementData = Arrays.copyOf(elementData, newCapacity);
     }
}
函数作用是对ArrayList扩容,当新的容量大于原来的ArrayList容量时,便使用Arrays.copyOf()进行扩容操作,很简单的函数。
但是如果仔细观察的话会发现它声明了一个局部变量oldData,但在后面的代码中并没有使用。为什么要声明这个局部变量,是疏忽还是其他的目的?
乍一看来后面并没有用到关于oldData局部变量,这句话显得多此一举!但是这是一个牵涉到内存管理的类,所以要了解内部的问题。而且为什么这一句还在if的内部,这跟elementData=Arrays.copyOf(elementData,newCapacity);这句是有关系的,下面这句Arrays.copyOf()的实现时新创建了newCapacity大小的内存,然后把老的elementData放入。好像也没有用到oldData,有什么问题呢。问题就在于旧的内存的引用是elementDataelementData指向了新的内存块,如果有一个局部变量oldData变量引用旧的内存块的话,在copy的过程中就会比较安全,因为这样证明这块老的内存依然有引用,分配内存的时候就不会被侵占掉,然后copy完成后这个局部变量的生命期也过去了,然后释放才是安全的。不然在copy的的时候万一新的内存或其他线程的分配内存侵占了这块老的内存,而copy还没有结束,这将是个严重的事情。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值