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()这个函数到底是判断的什么?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论