Java 阵列列表容量增量方程

Java 阵列列表容量增量方程,java,arraylist,Java,Arraylist,在ArrayList.java的JDK 1.7中,方法ensureCapacity使用以下表达式增加阵列容量:int newCapacity=oldCapacity+(oldCapacity>>1),因此新容量似乎比旧容量几乎多50% 然而在很多书中都说容量是原来的两倍。。。所以这些书没有更新或者我不太懂?来自: 增长政策的细节如下: 没有指定超出以下事实的 添加元素具有常量 摊销时间成本 换句话说,这些书对于其他实现可能是准确的,但没有什么是可以保证的——Java 7源代码仍然与文档兼容,但显

在ArrayList.java的JDK 1.7中,方法
ensureCapacity
使用以下表达式增加阵列容量:
int newCapacity=oldCapacity+(oldCapacity>>1)
,因此新容量似乎比旧容量几乎多50%

然而在很多书中都说容量是原来的两倍。。。所以这些书没有更新或者我不太懂?

来自:

增长政策的细节如下: 没有指定超出以下事实的 添加元素具有常量 摊销时间成本


换句话说,这些书对于其他实现可能是准确的,但没有什么是可以保证的——Java 7源代码仍然与文档兼容,但显示这些书过于具体。

您所理解的是正确的,新容量比旧容量高50%

在Java 6中,新容量计算如下

int newCapacity = (oldCapacity * 3)/2 + 1;

这就是像Java这样的开放源代码语言的优点,你可以看到它的实现——如果它不符合你的要求,你可以实现你自己的。Java中的ArrayList将容量增加50%。然而,Java中的vector类的功能类似于ArrayList,但提供了同步,它的容量将增加一倍。这很可能是您的书中出现混淆的原因。

Java 6中,新容量的计算公式为=>int-newCapacity=(旧容量*3)/2+1


Java 7中,新容量的计算公式为=>int newCapacity=oldCapacity+(oldCapacity>>1)

如果JDK 7提供了该表达式,它如何与文档兼容?这里详细说明了如何计算增长政策!文档中没有指定增长策略,它必须在源代码中指定,这就是源代码,但是正如您所看到的,实现已经更改(可能是因为lshift比乘除运算更快。@xdevel2000:JDK 7实现中的哪一位与我所引用的不兼容?你是说添加元素没有固定的摊销时间成本吗?文档提供了保证,但仍然留有灵活性的空间。因此推测
new arrarylist(0).添加(1);
在1.6中工作,但会中断(IndexOutOfBoundsException)在1.7中,我希望数组列表被扩展-参数只是初始容量。如果这引发了异常,我会非常惊讶。是的,我的错。只要看一下源代码,在1.6和1.7中,如果从
新的ArrayList(0)
开始,数组大小每次增加1。