kagamihogeの日記

kagamihogeの日記です。

java.util.ArrayList探訪

基本的なクラスだけあってか、複雑な点はありませんでした。

Listを2回implements

ArrayListとその親クラスのクラス定義はこうなっている。

public abstract class AbstractList extends AbstractCollection implements List

public class ArrayList extends AbstractList
implements List, RandomAccess, Cloneable, java.io.Serializable

java.util.Listを都合2回implementsするわけだけど、これは何の意味があるんだろうか・・・。

java.util.ArrayList#ensureCapacityの動き

これもまぁ重箱の隅の隅レベルなんだけど・・・。

javadocでは

必要に応じて、この ArrayListインスタンスのサイズを拡大し、少なくとも最小サイズ引数で指定された数の要素を格納できるようにします。

で、実際のソースはというと

public void ensureCapacity(int minCapacity) {
...
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
Object oldData[] = elementData;
int newCapacity = (oldCapacity * 3)/2 + 1;
if (newCapacity < minCapacity)
newCapacity = minCapacity;
elementData = new Object[newCapacity];
...

引数で指定した値が、今のキャパの大きさ1.5倍+1より大きい場合はそっちの値を使うようになっている。minCapacity > oldCapacityの条件もあるので、

ケース キャパの大きさ
oldCapacity < minCapacity < oldCapacity1.5倍+1 oldCapacity1.5倍+1
oldCapacity < oldCapacity1.5倍+1 < minCapacity minCapacity

と、微妙に動作が異なる。とはいえこのメソッドを直接呼ぶことはまずないんだけどさ。