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

    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()这个函数到底是判断的什么?

阅读 2.9k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题