日期:2014-05-20  浏览次数:20654 次

一个关于JDK源码中ArrayList类的add方法的问题
ArrayList源码中,add和addAll方法中调用到一个内部的保证数组容量的方法,其中有这么一句:
int   newCapacity   =   (oldCapacity   *   3)/2   +   1;

这个算法(*3/2+1)有什么依据没有?还是随便这么写的呀?

------解决方案--------------------
没有依据。满了就改变容量。
------解决方案--------------------
肯定是尝试过了,这种算法性能高
------解决方案--------------------
增加一半
------解决方案--------------------
去问sun的工程师吧哈
------解决方案--------------------
一个简单的扩充容量的算法,不知道你要问的“为什么”是什么。
------解决方案--------------------
ArrayList因为底层是用数组实现
LZ想问增加时候
int newCapacity = (oldCapacity * 3)/2 + 1;为什么newCapacity 要这样计算

这问题您需要问 SUN的工程师 我看数据结构书上说ArrayList 实现数组到达限制后要增加为原来一倍 比较好而且也实现ArrayList
int newCapacity = oldCapacity * 2;
SUN为什么用1.5倍+1................................

------解决方案--------------------
这主要防止在 ArrayList 初始化时的初始容量设为了 0 的缘故吧,如果不加 1 的话,这个数组永远也别想再增加了。

至于为什么是 *3/2 那就很难知道为什么了,可能正像楼上有位仁兄说的可能与性能关吧。