JAVA集合(二)-ARrayList

4427 ワード

ArrayListは、動的配列に相当する配列キューです.Javaの配列に比べて容量が動的に増加します.AbstractListに継承し、List,RandomAccess,Cloneable,javaを実現した.io.Serializableこれらのインタフェースは、関連する追加、削除、修正、遍歴などの機能を提供しています.
一.ArrayList継承構造
java.lang.Object
     -java.util.AbstractCollection
          -java.util.AbstractList
               -java.util.ArrayList
すべてのインプリメンテーションのインタフェース:
直接サブクラス(使用が少ない):
二.実装方法の紹介
2.1構築方法:
~ArrayList()
空の配列Object[]を、現在のインスタンスのelementDataプロパティに割り当てます.オブジェクトを最初に追加すると、配列はデフォルトで10に拡張されます.
~ArrayList(int initialCapacity)
入力されたinitialCapacityのサイズを持つObject配列をインスタンス化し、現在のインスタンスのelementDataプロパティに値を割り当てます.
~ArrayList(Collection extends E> c)
入力された集合クラスのすべての要素を含むObject配列を作成します.
構造法によりArrayListは配列方式でオブジェクトを格納していることが分かる
2.2 add挿入オブジェクト
 public boolean add(E e) {
        ensureCapacityInternal( size + 1); 
        elementData[size ++] = e;
        return true ;
    }

オブジェクトを挿入するのは簡単に見ると配列にオブジェクトを追加することですが、ensureCapacityInternalメソッドは配列の大きさを超えているかどうかを検査し、超えたら拡張します.
private void ensureCapacityInternal(int minCapacity) {
        if (elementData == EMPTY_ELEMENTDATA) {
            minCapacity = Math. max(DEFAULT_CAPACITY, minCapacity);
        }

        ensureExplicitCapacity(minCapacity);
    }

ArrayListの既存のサイズプラス1に基づいて、minCapacityとして、インスタンス中のelementDataが空Object配列であるか否かを判断し、空であればminCapacityと10のサイズを比較し、minCapacityの大きい値に付与する.
minCapacityと現在の配列のサイズを比較し、minCapacityがobject配列のサイズより大きい場合は拡張します.新しいコンテナサイズnewCapacityが生成され、現在の配列のサイズ*1.5倍の計算方法が得られます.
minCapacityが算出するnewCapacityより大きい場合は、minCapacityをnewCapacityに付与し、最後にsystemを用いる.arraycopy法による拡張配列の構築
その他の方法:
~public boolean add(int index,E element)指定された位置にオブジェクトを挿入し、指定された位置にオブジェクトがある場合、そのオブジェクトを後ろに移動する
~public E set(int index,E element)指定した位置のオブジェクトを置き換える
~public boolean addAll(Collection extends E>c)コレクション内のすべてのオブジェクトを挿入
~public boolean addAll(int index,Collection extends E>c)指定された位置にセット内のオブジェクトを挿入する
2.3 removeオブジェクトの削除
public boolean remove(Object o) {
        if (o == null ) {
            for (int index = 0; index < size; index++)
                if (elementData [index] == null) {
                    fastRemove(index);
                    return true ;
                }
        } else {
            for (int index = 0; index < size; index++)
                if (o.equals(elementData [index])) {
                    fastRemove(index);
                    return true ;
                }
        }
        return false ;
    }

削除したオブジェクトがnullであるかどうかを判断し、nullである場合、配列内のすべてのオブジェクトを巡り、nullであるかどうかを判断し、nullである場合、fastRemoveを呼び出して対応する位置のオブジェクトを削除します.
fastRemoveの実装方法は、配列内のindex後の要素を前にコピーし、配列内の最後の要素の値をnullに設定し、このオブジェクトへの参照を解放するためにGCを自動的に呼び出すことです.
このオブジェクトがnullでない場合、Eのequalsメソッドで要素の値が同じかどうかを比較し、同じであればfastRemoveメソッドを呼び出して削除操作を完了します.
他の方法:
~public E remove(int index)指定された位置のオブジェクトを削除し、remove(E)よりも1つの配列範囲の検出を実現しますが、要素への遍歴が少なくなるため、パフォーマンスが向上します
~public E removeRange(int fromIndex,int toIndex)fromIndexからtoIndexまでのインデックス内のオブジェクトを削除する
~public boolean removeAll(Collection>c)コレクションcに含まれるオブジェクトを削除
2.4 getオブジェクトの取得
public E get( int index) {
        rangeCheck(index);

        return elementData(index);
    }

配列範囲検出、配列が境界を越えたかどうかを検出し、配列内の要素を返します.
2.5 contains判定対象が存在するか否か
 public boolean contains(Object o) {
        return indexOf(o) >= 0;
  }

  public int indexOf (Object o) {
        if (o == null ) {
            for (int i = 0; i < size; i++)
                if (elementData [i]==null)
                    return i;
        } else {
            for (int i = 0; i < size; i++)
                if (o.equals(elementData [i]))
                    return i;
        }
        return -1;
    }

オブジェクトがnullであるかどうかを検索し、nullである場合、配列を直接遍歴し、nullの要素を検索し、位置を返します.nullでない場合は配列を遍歴し,equalsメソッドは同じか否かを判断し,位置を返す.最後にこの位置が0より大きいかどうかを判断する
三.ArrayListまとめ
ArrayListでは、いくつか注意が必要です
~ArrayListは配列方式により実現する、最大容量はIntegerである.MAX_VALUE
~ArrayListはオブジェクトを挿入する際に拡張の判断を行い、オブジェクトを削除する際に配列の大きさを変更せず、オブジェクトを検索する際に配列の遍歴を行う
~ArrayListは非スレッドで安全