java 数组扩容_ArrayList的数组扩容是如何考虑溢出的?

ゝ一世哀愁。 2022-10-23 12:48 245阅读 0赞

谢谢“MartinDai”按照这个老哥的建议,调试了一波,很有效。

我陷入的问题有点钻牛角尖了,或者是理解能力不够。

总结:

数组size值发生溢出,发生在第二个判断 if (newCapacity - maxArraySize > 0) = true时,即size要足够大,我才考虑数组会溢出的问题。

正常情况下,每次size扩容1.5倍。当size扩大1.5倍发生int的溢出时,就每次进行最小扩容(+1)就可以了。第一个判断 if (newCapacity - minCapacity < 0) 这个就是为这个溢出准备的。

还有一个问题:为什么扩容的倍数为1.5 而不选择其他倍数?

//抛异常的情况:

//数组原大小oldCapacity 已经为int的最大值,此时再次调用grow()扩容minCapacity发生溢出,进入hugeCapacity() 抛出异常。 这是size会溢出的情况,只有size大于nteger.MAX_VALUE - 8 时,才开始考虑是不是抛出溢出异常

public static void main(String[] args) {

int maxArraySize = Integer.MAX_VALUE - 8;

int oldCapacity = Integer.MAX_VALUE;

int minCapacity = oldCapacity + 1;

// overflow-conscious code

int newCapacity = oldCapacity + (oldCapacity >> 1);

// 1.5倍扩容大小 - 元素个数

// 正常情况下,1.5倍的扩容 肯定大于 元素个数,肯定不需要频繁的扩容,所以一次来大一点,至于为什么是1.5倍,这个就不知道了。

// 当 1.5倍扩容发生int的溢出时,就每次进行最小扩容(+1)就可以了。

if (newCapacity - minCapacity < 0) {

newCapacity = minCapacity;

}

//newCapacity大于maxArraySize 才考虑进入这个方法

if (newCapacity - maxArraySize > 0) {

newCapacity = hugeCapacity(minCapacity);

}

System.out.println(newCapacity);

}

private static int hugeCapacity(int minCapacity) {

if (minCapacity < 0) // overflow

{

throw new OutOfMemoryError();

}

return (minCapacity > Integer.MAX_VALUE - 8) ?

Integer.MAX_VALUE :

Integer.MAX_VALUE - 8;

}

}

发表评论

表情:
评论列表 (有 0 条评论,245人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java数组扩容

    本博文源于自己遇到一个扩容问题,以往数组扩容就是利用数据结构元素向后移动,但这java刚再次熟悉,不好操作最后还是用双指针法进行解决。 数组扩容思想 找到元素

    相关 java数组扩容

    本文作者:合肥工业大学 管理学院 钱洋 email:1563178220@qq.com 内容可能有不到之处,欢迎交流。 未经本人允许禁止转载。 说明 在编写一些非参

    相关 数组复制/扩容

    简述 编程的过程中,经常会遇到的一个问题是需要将一个数组当中的元素复制到另一个数字来操作或者保存。这时,一种简单高效的方法就显得尤为重要。 首先要申明的是,数组属于引用

    相关 java 数组扩容方法

    java 拓展数组长度的方法 前言 数组是我们编程常用到的一种最简单的数据结构,操作简单,功能强大。 但是也是一个缺点,就是一旦创建了数组,就不能改变它的大小。