詳細なリストのJavaのArrayListコレクション

リストは、インターフェイスを実装するコレクションクラスです

リスト:

特徴:秩序、繰り返し可能

これは、2つの一般的な実装クラスがあります。

一.ArrayList:

特徴:ストレージの配列の形式で行われ、したがって、より高速なランダムアクセスが、それはすべてのクエリに適用されます。

短所:挿入に該当しないと削除操作は、アレイ内の各可動要素ので、必要とされます。

ソースによると、私たちは、以下の点を描くことができます。

初期化時に1.ArrayList我々は指定された長さを持っていない場合、それは10のデフォルトの長さを持つことになり、

プライベート 静的 最終 int型 = 10 DEFAULT_CAPACITY。

 

2.私たちは、元の容量よりも時間の新しい要素を追加した場合、ArrayListには、それを行う方法ですか?

ArrayListには、配列に格納され、その後、確かに一度宣言を変更することはできません、配列の特徴を継承しているので、それを変更することはできませんので、これは、Javaは、この問題を解決する方法である、、、膨張機構のArrayListを必要としますか?

過渡オブジェクト[]からelementData。

これは、アレイの将来の拡張のために準備し始め、一時変数、配列の宣言であります

パブリック ブール追加(E、E){ 
        ensureCapacityInternal(サイズ + 1)。  // インクリメントmodCount !! 
        elementData [サイズ++] = E。
        返す ; 
    }

ensureCapacityInternal上側コード(サイズ+ 1)膨張の始まりであります

我々は徹底的にソースコードに指すように続け

プライベート 無効 ensureCapacityInternal(int型minCapacityに){ 
        ensureExplicitCapacity(calculateCapacity(からelementData、minCapacityに)); 
    } 

    プライベート ボイド ensureExplicitCapacity(INT minCapacityに){ 
        modCount ++ 

        // オーバーフロー意識コード
        場合(minCapacityに- elementData.length> 0 
            成長(minCapacityに)。
    }

私たちは、ensureCapacityInternalが、これは深さで、我々はensureExplicitCapacityを呼び出すために引き続き見ました

 

 
 
プライベート静的最終的なオブジェクト[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; //デフォルト空集合
 
 
プライベート静的最終int型のDEFAULT_CAPACITY = 10; //默认10

プライベート
静的 INT calculateCapacity(オブジェクト[]、のからelementData INTがあることminCapacityに){
      //現在elemenrData(カレントデータ)が空集合、容量拡張を取得する次のステップである場合
IF(==のからelementData DEFAULTCAPACITY_EMPTY_ELEMENTDATA){ 戻りMath.maxは(DEFAULT_CAPACITY、minCapacityにすること); } リターンminCapacityにすること; }

その後、我々は、前に戻ります

プライベート ボイド ensureExplicitCapacity(INTがあることminCapacityに){ 
        ModCount ++ ; //各変更セット回数( AbstractList.classの値)
// オーバーフロー配慮コード検出オーバーフロー
//配列の>長さの最小限必要な容量は、それが必要な拡張がある場合
IF(minCapacityにすること- elementData.length> 0 )成長(BE minCapacityにします);}
 プライベート ボイド(成長intはminCapacityにすること){
         // オーバーフロー配慮コード
        INT oldCapacity = elementData.length;
         INT(oldCapacity >> 1。newCapacity oldCapacity + = ); // 1.5(1.8,1.7)初期容量の(1.5倍1.6 + +1)
         IF(newCapacity -であるminCapacityに<0 
            newCapacity = minCapacityにすること;それは割り当てを置くのに十分でない場合//値必要
         IF(newCapacity - MAX_ARRAY_SIZE> 0 
            newCapacity = hugeCapacity(れるminCapacityに); //大容量の分析は、次のコード
         / / minCapacityには、通常、SOこれを獲得し、近隣サイズに使用されます。
        の=からelementData Arrays.copyOf(newCapacity、のからelementData); //これは、アレイは、拡張の形で格納することができる理由である
    } 

    プライベート 静的 int型 hugeCapacity(intはminCapacityにすること){
         IF(minCapacityに<0である)// オーバーフローメモリオーバーフロー
            スロー 新しい新規のOutOfMemoryError( );
         リターン(minCapacityに> MAX_ARRAY_SIZE)//三項演算子である?
            Integer.MAX_VALUEの:
            MAX_ARRAY_SIZE; 
    }

上記のコードを読んだ後、私たちは、あなたが初期値を与えていない場合、デフォルト値は10で出すことができ、元の配列の際の拡張に変更はなく、1.5倍の増加の配列をコピーしませんでした

3.ArrayListは、スレッドセーフです。あなたがスレッドセーフsynchronizedキーワードを使用するか、Collections.synchronizedList()メソッドを使用することができますを実装する場合は、次のとおりです。

一覧<オブジェクト>オブジェクト= Collections.synchronizedList(新しい ArrayListを<>());

 

おすすめ

転載: www.cnblogs.com/guochenchen/p/11204633.html