インタビューの質問一覧の分別収集のコレクション

ベクターおよびArrayListのとLinkedListの違いと接続ならびにそれぞれのアプリケーションシナリオの
スレッドの安全性:
ベクタ:ベクタ容量を作成するときに指定されていない場合、デフォルトのサイズは10で、根本的なアレイベースの実装、スレッドセーフは、同期の同期方法に基づいており、プラスロック

 

メソッドを追加

 

 

 

クエリメソッド

 

 

 

 

 

 

 

 

 


ArrayListを:根本的な配列、スレッドセーフな、高効率のクエリに基づいており、変更、追加および削除しても効率が低いです

メソッドを追加

 

 

 照会方法:

 

 

 

 

 

 

 

 

 

LinkedListの:クエリの二重リンクリスト構造、スレッドセーフな、低効率の基礎となると、変更、追加および削除しても高効率

メソッドを追加

 

 

 クエリメソッド

 

 

 

 

 

 

 

 

 


使用シナリオ:
1.Vectorめったに使用しないで
あなたはLinkedListの選択することができます追加、削除が多数必要な場合2.
あなたは、クエリの多数を必要とArrayListを選択することができます変更する場合3.


いくつかの方法がありますが、あなたはArraListスレッドセーフを保証したい場合は?
表1自身が追加/セット/削除ロック、一般的にサービスに応じて、ArrayListのコレクションクラスを書き
リスト<オブジェクト>リスト= Collections.synchronizedList(使用2新規のArrayListを<>()); // 同期ロックを使用する
3新規の。CopyOnWriteArrayListと<>()を追加します( ""); // ReentrantLockのロックが使用

CopyOnWriteArrayListと底を理解できますか?違いは何ですか、CopyOnWriteArrayListとし、Collections.synchronizedList
実装基盤となる1 CopyOnWriteArrayListと:
操作の実装ではCopyOnWriteArrayListと修飾は、操作を完了するのにコストがかかり、かつ新しいコレクションにオリジナルの収集ポイントを変更した後、データの新しい配列をコピーします
ReentrantLockの保証を使用してマルチスレッド環境でのセキュリティのコレクション

追加パブリック(E E){ブール
	ReentrantLockの= this.lockの最終的なロック; //ロックを取得
	lock.lockを(); //ロック
	試し{ 
	  オブジェクトを[] =のgetArray要素(); //現在の配列データを取得します、要素に
	  INT LEN = elements.length; //は、アレイの現在の長さを記録
	  オブジェクトの[] =たnewElements Arrays.copyOfは(エレメントは 、+ 1 LEN); //は新しい配列にコピー
	  されたnewElements [LEN] = Eを; //意志アレイへの新しいデータのうち、
	  現在のアレイ新しいデータへのポインタ//;はsetArray(たnewElements)
	  真への復帰; 
	} {最後に
	  lock.unlock(); //リリースロック
	} 
}

  

CopyOnWriteArrayListとアプリケーションシナリオ:読み取り操作のために、書き込み動作のシナリオよりもはるかに大きい(基礎となる読書、直接アクセスロックされませ)

2プラスCollections.synchronizedListにロック同期のほぼすべての基本となるメソッド
シーンを:CopyOnWriteArrayListと比べて書き込みパフォーマンスが向上ししかしCopyOnWriteArrayListと比べて読み取りパフォーマンス


4 CopyOnWriteArrayListとの考えは一種方法であり、欠点は何ですか?
デザイン:別々の読み取りと書き込み、最終的には一貫性の
短所:コピー・オン・ライトメモリによるメモリ使用量、オブジェクトが大きいとYongGC FullGCの傾向がある場合は、2つの空間オブジェクトが存在します


、約5 ArrayListの膨張機構話がどのようにある
1 .JDK1.8以前のデフォルトのサイズは1.8と似jdk1.7の拡大、JDK1.6 1.5倍、10で+1

 2.ArrayListセットのサイズ、作成した場合、デフォルトセットのサイズが指定されている0に指定されていない場合、指定の、初期値
 最初の追加データは、拡張がセットサイズ10、第二およびその後のそれぞれの時刻時間によるINT oldCapacity = elementData.length; newCapacity = oldCapacity +(oldCapacity >> 1)、 即ち1.5倍膨張

 

ゴーensureCapacityInternal()ArrayListのサイズを作成するためのメソッドは、指定されたとき、過去にパス、あなたはサイズを指定しない場合は0

 

デフォルトの初期容量10

 

 

 

現在のArrayList裁判官入力された判断が空の場合、minCapacityに割り当て、Math.max()と最初の判断がその大きなを指定し、minCapacityにすることが割り当てられて置きます

その後ensureExplicitCapacity()メソッドを行きます

 

 

膨張進み、テイク成長()メソッドよりも大きいとするminCapacityに上を通過する場合、現在の長さよりも大きいのArrayListに渡されたの数かどうかを決定します

 

 

 

 

oldCapacityに割り当てられているコレクションの長さ(旧容量)

newCapacity(新規容量)oldCapacity +(0.5 *値oldCapacity)の値に等しいです

newCapacity-minCapacityにはゼロ未満である分析、それは値がnewCapacity minCapacityにに割り当てられている場合よりも少なくなります

newCapacity-MAX_ARRAY_SIZE(設定された最大容量)がゼロよりも大きいが、分析するhugeCapacity()はnewCapacityに割り当てられた値を返す場合よりも大きくなります

元のコレクションに割り当てられた割り当ての良い新しいセットに割り当てられた容量にオリジナルと再コピーのコレクション

 

 

 

ゼロ未満、それが報告されている場合minCapacityには、判断を下すメモリ不足エラー

最大値は過去の整数型で返されます超える場合、minCapacityには、最大容量よりも大きいを設定するかどうかを決定することは、コレクションセットの最大容量が最大容量を超えて戻ります未満であります

 

 

 

 

おすすめ

転載: www.cnblogs.com/wishsaber/p/12490742.html