Java源码中如何对ArrayList进行容量调整呢?

璐璐 Java面经 发布时间:2022-10-28 22:05:28 阅读数:2332 1 集合容器面试题(2023优化版)
下文笔者讲述Arraylist扩容的相关源码分析
通过此篇源码分析,你将掌握JDK对ArrayList数组容量的扩容思路

数组扩容的方法

ArrayList中数组扩容是通过调用ensureCapacityInternal方法
达到数组扩容的目的
ensureCapacityInternal方法用于保证数组的容量处于够用状态

ensureCapacityInternal方法的源码

//主方法:用于确保数量够用
private void ensureCapacityInternal(int minCapacity) {
   ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}

//计算当前容量
//注意事项:
//如果elementData等于null,则返回默认容量10与minCapacity=size+1中的最大值
private static int calculateCapacity(Object[] elementData, int minCapacity) {
   if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
       return Math.max(DEFAULT_CAPACITY, minCapacity);
  }
   return minCapacity;
}

//检测当前ArrayList的实际大小
//此方法用于判断elementData是否够用
private void ensureExplicitCapacity(int minCapacity) {
   modCount++;

   //minCapacity如果大于了实际elementData的长度
   //则说明elementData数组的长度不够用
   //增长值为:所需最小空间-数组长度
   if (minCapacity - elementData.length > 0)
       //ArrayList自动扩容方法
       grow(minCapacity);
}

//Array扩容的真真方法
private void grow(int minCapacity) {
   //将扩充前的elementData大小给oldCapacity
   // overflow-conscious code
   int oldCapacity = elementData.length;
   //新容量newCapacity是1.5倍的旧容量oldCapacity
   int newCapacity = oldCapacity + (oldCapacity >> 1);
   //这句话就是适应于elementData就空数组的时候,length=0,那么oldCapacity=0,newCapacity=0,所以这个判断成立,在这里就是真正的初始化elementData的大小了,就是为10。
   if (newCapacity - minCapacity < 0)
       newCapacity = minCapacity;
   //如果newCapacity超过了最大的容量限制,就调用hugeCapacity,也就是将能给的最大值给newCapacity
   if (newCapacity - MAX_ARRAY_SIZE > 0)
       newCapacity = hugeCapacity(minCapacity);
   //其实扩容是采用数组复制达到数组变大的效果
   elementData = Arrays.copyOf(elementData, newCapacity);
}

//为数组赋最大值
private static int hugeCapacity(int minCapacity) {
   if (minCapacity < 0) // overflow
       throw new OutOfMemoryError();
   //当minCapacity都大于MAX_ARRAY_SIZE
   //则返回Integer.MAX_VALUE返回
   //否则将MAX_ARRAY_SIZE返回
   //Integer.MAX_VALUE:2147483647  
   //MAX_ARRAY_SIZE:2147483639 
   return (minCapacity > MAX_ARRAY_SIZE) ?
       Integer.MAX_VALUE :
   MAX_ARRAY_SIZE;
}
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaMianJing/202210/16669662314734.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者