Java源码ArrayList中的MAX_ARRAY_SIZE问题(jdk1.8)

发布于 2022-09-11 15:49:47 字数 1280 浏览 25 评论 0

    private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

    private static int hugeCapacity(int minCapacity) {
        if (minCapacity < 0) // overflow
            throw new OutOfMemoryError();
        return (minCapacity > MAX_ARRAY_SIZE) ?
            Integer.MAX_VALUE :
            MAX_ARRAY_SIZE;
    }

上面规定了MAX_ARRAY_SIZE 的大小为Integer.MAX_VALUE - 8,grow函数中的判断
if (newCapacity - MAX_ARRAY_SIZE > 0),说明了如果newCapacity 大于MAX_ARRAY_SIZE ,则执行hugeCapacity()函数,并且返回(minCapacity > MAX_ARRAY_SIZE) ?Integer.MAX_VALUE :MAX_ARRAY_SIZE;这里就不明白了,MAX_ARRAY_SIZE 等于Integer.MAX_VALUE - 8,这里的8个字节不是存内存存储对象头信息和对象头信息吗?为什么如果超过MAX_ARRAY_SIZE ,还可以创建Integer.MAX_VALUE大小的数组,这8个字节的空间可有可无吗?不互相矛盾吗?hugeCapacity()这个函数到底是判断的什么?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文