【毎日一編】JAVA集合詳細----ARrayList(上)

4358 ワード

前文リンクListインタフェースの詳細
    今日は明日の分も書いたらどうですか.
    ArrayListはJAVA開発者が最もよく使うリストの一つではありません.このクラスは虚基クラスAbstractListを継承することでListインタフェースを実現し、ついでにCollectionインタフェースやLterableインタフェースも実現しています.以上の3つのインタフェースの用途は前述したように、ここではくだらないことではありません.
    同時にArrayListクラスはRandomAccess(キュー用のタグインタフェースであり、このインタフェースは高速ランダムアクセスをサポートすることを示す)、Cloneable(同様にタグインタフェースであり、このインタフェースはObject.clone()メソッドを書き換えたことを示し、clone()メソッドによって合法的に複製することができる)、serializable(タグインタフェース、このインタフェースを実装してこのようなシーケンス化を可能にします.そうしないと、シーケンス化時に保存され、serialVersionUIDと組み合わせてクラスバージョンを識別できます)
    ArrayListは、その名の通り配列リストという意味であり、リストインタフェースの可変サイズ配列として実現され、このクラスはnullを含むすべての配列要素を可能にするすべてのオプションのリスト操作を実現し、内部配列サイズを調整する方法を提供する.O(n)速度実現のほとんどの操作は、ArrayListが非同期であり、隣のVectorが同期であることに注目すべきである.リストリスト=Collections.synchronizedList(new ArrayList(...);文によってロックをかけることができる.
    なお、ArrayListの反復器は「高速失敗」であり、高速失敗の詳細は高速失敗を参照することができ、数日後にはLiterator(反復器)が作成された後、反復器を使用しないremove()またはadd()ArrayList構造を変更する方法では、このエラーが発生します.この特性は、通常のforサイクルでlistのremove()メソッドを呼び出して要素を削除することができません.jdk 1.8後、removeAll()メソッドを使用してより優雅に解決することができます.
    次に、ArrayListの興味深い定数と方法について説明します.
      定数:
    1.serialVersionUID、シーケンス化時にクラスバージョンを明記するには、何も言うことはありません.
    2 DEFAULT_CAPACITY=10、デフォルトの初期化容量、サイズは10要素
    3 EMPTY_ELEMENTTDATA、空の要素グループ、初期化時に使用
    4.DEFAULTAPACITY_EMPTY_ELEMENTATAデフォルト容量空要素配列、初期化時に使用
    5.elementData要素配列、ArrayList配列のデータはこの配列に保存されており、最初の要素を入れるときに空の配列、つまり上のEMPTY_ELEMENTATAに等しい場合、初期サイズ(capacity)が与えられる
    6.size,emmmくだらないことを言わない
    方法:
    1.コンストラクション関数ArrayList()は、3種類のパラメータがあり、intを入力すると入力の大きさに応じて1つの配列が初期化されます.入力しないか、0を入力するとelementData=DEFAULTAPACITY_EMPTY_ELEMENTATA、つまり空の配列になります.Collection(集合すると)を入力するとCollection.toArray()メソッドが配列に転用され、失敗すると(結果はObject[]ではありません)の場合は続きませんが、成功するとArray.copyOfメソッドを呼び出してこの配列をelementData配列にコピーします.
    2.trimToSize()メソッド.elementDataのサイズをsizeサイズに変更してスペースを節約します.ここで使うかArray.copyOfメソッドを使うか、次はArraysと書きましょう.同様にサイズを変更する前にこのメソッドはmodCount(ArrayListは宣言せず、親AbstractListに直接継承)の値+1もしています.この操作の解釈はmodCountを参照してください
    3.ensureCapacity(int size)、ensureCapacityInternal()、ensureExplicitCapacity()メソッド.この3つの素質はelementDateのサイズを追加することができ、ここでは小さな配列のサイズをできるだけデフォルト値(10)にするように複雑な判断を行い、いずれにしても最後にgrow()メソッドを呼び出してサイズを拡大する
    4.grow()メソッド.ここでは、INTEGER.MAX_SIZE-8という新しい定数MAX_ARRAY_SIZEについて説明します.この定数は、ArrayListサイズが達成できる最大値です.一部の仮想マシンでは、ヘッダバイトを占有するにはもう少し少ないので、どうせ超えたらOOMエラーを報告します.
        コードに戻って、この方法はビット演算も使って、とても面白い貼り付けます
 private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }private static int hugeCapacity(int minCapacity) {
        if (minCapacity < 0) // overflow
            throw new OutOfMemoryError();
        return (minCapacity > MAX_ARRAY_SIZE) ?
            Integer.MAX_VALUE :
            MAX_ARRAY_SIZE;
    }

いずれにしても右シフトは2を除いて1.5倍の拡張となりますが、それでも大きくなければ入力の大きさに合わせて、大きさがオーバーフローしたらhugeCapacityを呼び出します.どうせ配列の大きさはIntegerの最大値を超えません.
    5.size()isempty()は、sizeという変数を使った方法です.
    6.index(),lastindexof(),この2つの方法はそれぞれ配列の前後方から遍歴し,
    7.clone()メソッド、super.clone()を呼び出し、Arrays.copyOf()メソッド(どのようにあなた)でキー配列をコピーし、modCountを空にします.
    8.toArray()メソッドは、パラメータなしではArrays.copyOf()ですが、パラメータがあれば面白いです.以下のようになります.
    
    @SuppressWarnings("unchecked")
    public  T[] toArray(T[] a) {
        if (a.length < size)
            // Make a new array of a's runtime type, but my contents:
            return (T[]) Arrays.copyOf(elementData, size, a.getClass());
        System.arraycopy(elementData, 0, a, 0, size);
        if (a.length > size)
            a[size] = null;
        return a;
    }

    ここで呼び出されたのはSystem.arraycopy()メソッドで、nativeメソッドで、emmmmは私がArraysを見たときにこれの解釈を見て、配列の長さを判断して、超えるとa[size]を空にして、この意味は何ですか?よく理解できません    
    9.elementDate()メソッド、projectメソッド、配列指定位置要素を返します.セキュリティは検証されていません.
    10.get()メソッドindex範囲を検証してelementDate()メソッドを呼び出す
    11.set()は、範囲を検証した後、配列を直接操作します.