Javaの - 基本 - コレクション

1、イテレータイテレータ、列挙型、反復子

  • イテレータ反復は列挙ではない、要素を削除することができます。
  • イテレータは、フェイルファストメカニズム、列挙型がサポートされていませんサポートしています。
  • 反復子反復子は、に基づいて機能を追加:トラバース開始位置、モバイル双方向、挿入エレメント、別の要素を選択し、インデックスを返します。

2、コレクション抽象クラスとインタフェース

   パブリックオブジェクト[]のtoArray()方法

  • 発生限界例外添字を避けるために、ループの長さインジケータの配列、
  • 初期の反復は終了し、新しい配列を返します。
  • 通常の反復が終了すると、要素があるかどうかを決定するために、拡張の必要性を決定
public Object[] toArray() {
    //1.准备数组
    Object[] r = new Object[size()];
    Iterator<E> it = iterator();
    for (int i = 0; i < r.length; i++) {
        //2.提前迭代结束,返回一个 i 长度的新数组
        if (!it.hasNext())
            return Arrays.copyOf(r, i);
        r[i] = it.next();
    }
    //2.正常迭代结束,检查是否还有新元素加入
    return it.hasNext() ? finishToArray(r, it) : r;
}

   パブリック<T> T []のtoArray(T [] a)の方法

  • 発生限界例外添字を避けるために、ループの長さインジケータの配列、
  • 任意の元の配列を保存して、新しい配列を返し、反復の最後の先には、元の配列、セットヌルの過剰部分の下に保存することができます
  • 通常の反復が終了すると、要素があるかどうかを決定するために、拡張の必要性を決定
public <T> T[] toArray(T[] a) {
    //1.传入的数组,足够大,使用该数组,否则使用新数组
    int size = size();
    T[] r = a.length >= size ? a :
            (T[])java.lang.reflect.Array
                    .newInstance(a.getClass().getComponentType(), size);
    Iterator<E> it = iterator();

    for (int i = 0; i < r.length; i++) {
        //2.提前迭代结束,
        if (! it.hasNext()) { 
            if (a == r) {
                //3.使用的是原数组,多余的部分全部置 null
                r[i] = null; // null-terminate
            } else if (a.length < i) {
                //4.原数组存不下,返回一个 i 长度的新数组
                return Arrays.copyOf(r, i);
            } else {
                //5.原数组存的下,拷贝到原数组中,多余的部分全部置null
                System.arraycopy(r, 0, a, 0, i);
                if (a.length > i) {
                    a[i] = null;
                }
            }
            return a;
        }
        r[i] = (T)it.next();
    }
    //6.正常迭代结束,检查是否还有新元素加入
    return it.hasNext() ? finishToArray(r, it) : r;
}

   Arrays.copy方法

  • 配列要素タイプは、アレイを作成することを目的と、直接新しいオブジェクト[newLength]なら、および方法使用したコピーSystem.arraycopyの
  • そしてSystem.arraycopyの差がある:Arrays.copyは、 新しい配列を作成し、System.arraycopyのは、単にデータをコピーします。

3、キューいくつかの方法、混乱

   キューがデータでいっぱいに追加するには、追加および提供は、IllegalStateExceptionが例外をスローします追加、唯一falseを返します。

   空のキューデータから取られ、はNoSuchElementExceptionが例外をスローします削除し、削除し、ポーリング、ポーリングはnullを返します。

   要素とPEEKは、空のキューの先頭を表示、要素はNoSuchElementExceptionがpeekはnullを返します、例外がスローされます。

4、ArrayListに 

電流収集、データを格納するために[]オブジェクトを使用して、アレイが一時キーワードを使用して変更されるフィールドがシリアライズされないことを示しています。

  • ランダム・マーカーインタフェースを実装し、それは主に、検索方法のコレクションでは、高速なランダムアクセスのサポートを表明しました。
  • これは、マーカーインターフェイス複製可能を実装し、cloneメソッドをオーバーライドします。浅いクローンコール親クラス、そしてデータ配列をコピーします。
  • Arrays.copyを使用して、ToArrayメソッドを書き直し 、それをコピーし、新しい配列を作成します。
  • writeObjectとreadObject方法、第1の書き込みint型の配列サイズを書き換え、ループのアレイにデータを書き込みます
  • この方法は:配列インデックスに応じて、設定、のindexOfを追加操作します。System.arraycopyの移動のアレイを使用して、指定された位置を追加、削除。
  • 拡張:拡張のための1.5倍のサイズ。
  • 反復子は、双方向トラバースを提供し、そしてあなたは、フェイルファストをサポートするためにトラバースするための開始位置を指定することができます。

ベクトルコレクション

  • ランダム・及び複製可能インターフェース、書き換えのtoArray、実装およびArrayListに同じことが実現します。
  • 唯一のwriteObjectメソッドを書き換え、この方法は、readObjectメソッドをオーバーライドしていません
  • 方法とArrayListの同じ組の共通の実装。反復子もフェイルファストサポートしています。
  • メソッドの共通セット、追加、削除、クローン、すべての同期を制御する同期キーワードに追加します。
  • 拡張:拡張のための2倍のサイズ。

5、LinkedListは(スタックとキューの両方の機能、リンクリストの実装)

  • 最初のヘッドノード、最後尾のノードは、サイズの大きさは、キーワードは一時変更のために使用されています。
  • リストには、操作の双方向キューメソッドの多くを達成するために、キューが継承され、同じ時間を継承します。
  • 彼は唯一のサブクラスがメソッドをオーバーライドすることができ、基本的な操作を実行するための抽象クラスの反復子を使用して、AbstractSequentialListを継承しています。
  • ArrayListを比較すると、あなたは、この最適化に適用した、すぐに指定された場所の要素を取得するだけでなく、指数は、見つける指定された場所を追加、置き換え、削除するために前方または後方にあるかを決定するために最適化することはできません。
  • cloneメソッドを書き直し
  • writeObjectとreadObject方法、第1の書き込みint型の配列サイズを書き換え、ループのアレイにデータを書き込みます

6、ArrayDeque(スタックとキューの両方の機能が、アレイが達成)

  • 両端キュー異なる、アレイを格納する配列をLinkedListの、ArrayDeque使用され,,かつ環状です。
  • 従来のアレイは、挿入ポイントの後のすべてのデータを移動させる必要がある、中間にデータを追加し、線形アレイであり、大面積アレイを移動させることなく循環します。
  • 新たなヘッド位置がヘッド-1、結果が-1を得た場合でなければならない、配列の長さ-1内の物理的な最後の位置で右に移動する必要があります。現在のアレイ15、頭と尾の長さを0に初期化され、その後、ヘッド14として、ヘッドに要素を追加し、尾部は0です。ヘッドは0になり、現在の完全な配列である尾に等しい場合。
  • 拡張時に頭と尾、コピーを決定する方法の現在位置を決定する必要があります。
  • クローン、writeObjectメソッドとreadObjectメソッドは、一貫性のArrayListとLinkedListの実装されています、。

7、ハッシュテーブル

  • 主な方法は、synchronizedキーワードに追加されたスレッドセーフです。
  • ハッシュバケットに対応する値を見つけるために、キーのハッシュ値を計算し、現在の合計は、その後の拡張のために、閾値以上であれば、すべての再計算されたハッシュ値は、存在する場合に片方向リンク・リスト・トラバーサル、人が追加されているかどうか、置き換え。
  • キー位置決めに格納されたハッシュ値であるので、キーが繰り返されていないため。
  • キーセットは、次のentrySetサポートフェイルファストメカニズムは、列挙およびイテレータは2つの方法で使用されています。

8、HashMapの

ノードのTreeNodeへのHashMap、変更前に比べ行うに1.8、およびノー​​ドタイプのバージョン2種類あり、さらに格納するための片方向リンクリストが、1.8バージョン、その後、ハッシュ値に基づいてハッシュバケットを見つけ、現在のハッシュバケット8の値に達したとき、それは赤黒木に変換される。6に到着したとき、再び一方向リンクリストに変換されます。だから、探しているときは、ノードの種類を決定します。

  • キーがnullであることができ、コードセグメントが由来します 
static final int hash(Object key) {
    int h;
    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

9、のLinkedHashMap

HashMapのへの継承は、内部が二重にリンクされたリストを維持し、あなたは秩序を保つことができます。

10、LinkedBlockingQueue

  • 統計の数にのAtomicIntegerを使用してint型のデフォルトの最大容量。
  • takeLock、putLockと条件notEmpty、notFull、サポート割り込みをロックリエントラントロックReentrantLockのを使用して、個別に定義されました。
  • 伝統的な生産、消費モデルのアクセス番号を使用してデータを追加し、片方向リンクリストを使用してノード方式。

11、LinkedBlockingDueue

  • LinkedBlockingQueueは、リスト・トラバーサル方向の増加を比較したが、ロック制御を使用します。

12、ArrayBlockingQueue

  • データを格納する配列を使用し、初期化時のサイズを指定する必要があります。
  • ロック制御の使用;

 

おすすめ

転載: blog.csdn.net/sky_eyeland/article/details/93590130