リストは、インターフェイスを実装するコレクションクラスです
リスト:
特徴:秩序、繰り返し可能
これは、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を<>());