ArrayListに、LinkedListは、CopyOnWriteArrayListとソースコード解析レコード

ArrayListの底部は、動的配列に基づいて行われます

図1に示すように、リストのサイズ増加、減少の長さは、欠失要素に従って行われます

要素を追加する場合2、ArrayListの、第一の配列の長さは、新しい拡張要素を追加することが完了した後、それが膨張(すなわち、反復配列)のために十分であれば、アレイに添加した場合、新たな要素を置くのに十分な十分であるかどうかを決定操作データを完了するために、新しい配列を追加します。

あなたも上書き削除する要素を、この配列の最後の位置は、前方に1を移動するには、配列の全体的な要素にコピーされ、配列に依存しており、空に、要素を削除3、ArrayListをnullに設定されているので、GCが回収されることを、削除操作をもたらすことは完了です。

。4、アレイレプリケートのArrayList依存変更操作が行われた場合、そうので要素の少数の配列、ArrayListの高効率(終了時の素子アレイ及び動作は、大量のデータをコピーするときにときに欠失を運びます);

5、System.arraycopyの(ソース・アレイ、ソース配列の添字開始位置、アレイのターゲットの長さが、ターゲットの開始位置の配列インデックスは、ソース配列をコピーします)。

6、Arrays.copyOf(ソース配列、標的配列の長さ)。

7、ArrayListの実装ランダム・インタフェースは、より高いクエリ効率(マーカーインタフェースは、インタフェースがデータを横断するイテレータインターフェイスでこれを達成しないループインターフェイスの通常使用してデータを介してこれを達成する方法はありません)が、そのデータを反復処理するループのために普通に適した、より低速のデータを修正し、それは、スレッドセーフです。

 

LinkedListのの底部はに二重にリンクされたリスト(ポインタ)に基づいて
最初の要素:|前へ|要素|次へ| ... _______________ ...

第二の要素:|前へ|要素|次へ|

前:上のアドレスの要素への参照
基準の要素の次のアドレスポイント:次の
要素は:実際のデータをに格納されている
第一.next .next = .previous /第二の要素の最初の要素第二の要素=要素.previous
LinkedListの追加および削除は、前回と次の修正速いのリストを変更することによって行われるが、ゆっくり要素を見つけています。
使用foreachのためのLinkedListの適切なより高い、効率データを横断する、スレッドが安全ではありません。

 

ArrayList、LinkedListの差
高効率であるのArrayListの発見が、(配列のコピーを含む)低修正要素効率
LinkedListの低い素子効率を見つけるが、変更された要素の高効率
場合ArrayListの操作データ列の末尾、データの作業効率がサブありませんLinkedListの中に、リンクされたリスト前方位置のデータが、作業効率がArrayListのより高いときLinkedListのが動作しました。
ArrayListの速いシーケンシャル挿入

 

CopyOnWriteArrayListとの操作データは、同様の、しかし異なる、とのArrayListとArrayListの
その追加、削除、変更、動作原理は同じである挿入、次いで底オブジェクト[]アレイ、アレイの新しいインスタンスです。

このデータの場合にマルチスレッド動作、データの最終的な一貫性(すなわち、別々の読み出しと書き込み、最終的に一貫性のある、元の配列、新しいアレイの書き込み操作、最終同期を読み取る)を確保することができるCopyOnWriteArrayListと、スレッドセーフです。

この方法は、例を追加します。

3.1 CopyOnWriteArrayListとの定義を見てください

 パブリック クラス CopyOnWriteArrayListと<E>   道具一覧<E> ランダム・、Cloneableを、java.io.Serializableの{
 
プライベート 静的 最終 長い serialVersionUIDの= 8673264195747942595L ; 過渡 決勝 ReentrantLockの=ロックの新新(ReentrantLockのの); プライベート 揮発性 過渡オブジェクト[]配列; // この配列は、底部である ... } パブリック CopyOnWriteArrayListと(){ // このオブジェクトを指し、長さが0の新しい配列インスタンス はsetArray(新しい新しいオブジェクト[0 ]); } 最終 空隙setArray(オブジェクト[] A){ // オブジェクト[]新たに作成されたアレイに配列参照 配列= A; }

 

addメソッドの定義で3.2ルック(あなたがするたびに新しいデータを新しい配列を作成する必要があるため、すべてのCopyOnWriteArrayListとは、書き込みのかかる操作の性能を比較するために分析することができます)

パブリック ブールの追加(E E){
    決勝 ReentrantLockの=ロックのこのの.lock; 
   Lock.lock();     // ロックする
   試み{ 
      オブジェクト[]の要素 =のgetArrayを(); // 取得元の配列
      int型のlen = elements.length ; 
      オブジェクト[]れたnewElements = Arrays.copyOf(要素、LEN + 1);   // 新しい配列(膨張)をインスタンス化し、新しい配列に元のデータ配列をコピーし 
      たnewElements [LEN] = E; // 新しいアレイはsetArray(たnewElements)に新しいデータを追加; // 真新しく作成されたリターンに配列ポイントへのオブジェクト配列参照; 
    } 最後に{ 
         lock.unlockを(); //ロック解除   
    } 
}

 

 

免責事項:この記事は星CSDNブロガーのオリジナルの記事「月で、CC 4.0 BY-SAの著作権契約書に従って、再現し、元のソースのリンクと、この文を添付してください。
オリジナルリンクします。https://blog.csdn.net/weixin_43179996/article/details/87261368

 

おすすめ

転載: www.cnblogs.com/yrjns/p/12381775.html