在默认容量基础上,常规扩容时计算新容量:
newCap = oldCap + max(minGrowth, oldCap >> 1)(向下取整,近似于 1.5 倍扩容计算出的首选扩容空间)。
- 若计算结果在
(0, SOFT_MAX_ARRAY_LENGTH——软上限]范围内(SOFT_MAX_ARRAY_LENGTH = Integer.MAX_VALUE - 8,为 JVM 对象头保留空间),则直接采用该值作为新容量。
- 若首选容量超出安全范围,触发大容量扩容逻辑:
- 计算算最小需求容量:
minLength = oldCap + minGrowth。- 若
minLength因整数溢出变为负数,则抛出OutOfMemoryError; - 若
minLength不超过软上限,直接扩容到软上限(减少之后频繁扩容复制开销); - 若
minLength大于软上限,会扩容到minLength,尽管此时很可能失败(由 JVM 决定)。
- 若
697

被折叠的 条评论
为什么被折叠?



