Collectionは、オブジェクトのセット、つまりコレクションの要素を表します。
Collection インターフェイスを実装するすべてのクラスは、2 つの標準コンストラクターを提供する必要があります。パラメーターなしのコンストラクターは空のコレクションを作成するために使用され、Collection パラメーターを持つコンストラクターは新しいコレクションを作成するために使用されます。この新しいコレクションには同じものがあります。渡されたコレクションとしての要素。後者のコンストラクターを使用すると、ユーザーはコレクションをコピーできます。
コレクション内の各要素をトラバースするにはどうすればよいですか? Collection の実際のタイプに関係なく、イテレータを返す iterator() メソッドをサポートしています。このイテレータを使用して、コレクション内の各要素を走査し、アクセスできます。 典型的な使用法は次のとおりです:
1 Iterator it = collection.iterator(); // 获得一个迭代子2 while(it.hasNext()) {3 Object obj = it.next(); // 得到下一个元素4 }
List は順序付けられた Collection であり、このインターフェースを使用すると、各要素の挿入位置を正確に制御できます。ユーザーは、Java 配列に似たインデックス (配列の添え字に似たリスト内の要素の位置) を使用して、リスト内の要素にアクセスできます。
Collection インターフェイスに必要な iterator() メソッドに加えて、List には ListIterator インターフェイスを返す listIterator() メソッドも用意されています。標準の Iterator インターフェイスと比較して、ListIterator には add() などのメソッドがいくつかあります。 、要素の追加、削除、設定、および前方または後方への移動が可能になります。
List インターフェイスを実装する一般的なクラスは、LinkedList、ArrayList、Vector、Stack です。
LinkedListはListインターフェースを実装し、null要素を許可します。さらに、LinkedList は追加の get、remove、insert メソッドを提供します。これらの操作により、LinkedList をスタック、キュー、または両端キューとして使用できるようになります。
LinkedList には同期性がないことに注意してください。複数のスレッドが同時に LinkedList にアクセスする場合は、アクセスの同期を自分で実装する必要があります。もう 1 つの解決策は、リストの作成時に同期されたリストを構築することです。 List list = Collections.synchronizedList(new LinkedList(...));
ArrayList は可変サイズの配列を実装します。 null を含むすべての要素が許可されます。 ArrayList には同期性がありません。
size、isEmpty、get、setメソッドの実行時間は一定です。ただし、add メソッドのコストは償却定数であり、n 個の要素を追加するには O(n) 時間がかかります。他の方法では実行時間が直線的になります。
各 ArrayList インスタンスには容量 (Capacity) があり、これは要素を格納するために使用される配列のサイズです。この容量は、新しい要素が追加されると自動的に増加しますが、増加アルゴリズムは定義されていません。多数の要素を挿入する必要がある場合は、挿入前に ensureCapacity メソッドを呼び出して ArrayList の容量を増やし、挿入効率を向上させることができます。
VectorはArrayListと非常によく似ていますが、Vectorは同期されています。 Vector で作成された Iterator は ArrayList で作成された Iterator と同じインターフェイスを持ちますが、Vector は同期されているため、Iterator が作成されて使用されると、別のスレッドによって Vector の状態が変更されます (たとえば、要素の追加や削除など)。 , Iterator メソッドを呼び出すと ConcurrentModificationException がスローされるため、例外をキャッチする必要があります。
Stack は Vector を継承し、後入れ先出しスタックを実装します。 Stack には、Vector をスタックとして使用できるようにする 5 つの追加メソッドが用意されています。基本的なプッシュ メソッドとポップ メソッド、およびピーク メソッドはスタックの先頭にある要素を取得し、空のメソッドはスタックが空かどうかをテストし、検索メソッドはスタック内の要素の位置を検出します。スタックは、作成後の空のスタックです。
1. Vectorはスレッド同期されているため、スレッドセーフでもありますが、ArrayListとLinkedListは非スレッドセーフです。スレッドの安全性要素が考慮されていない場合は、通常、ArrayList と LinkedList を使用する方が効率的です。
2.ArrayList と Vector は動的配列に基づいたデータ構造を実装し、LinkedList はリンク リスト データ構造に基づいています。
3. コレクション内の要素の数が現在のコレクション配列の長さより大きい場合、Vector の増加率は現在の配列の長さの 100%、ArrayList の増加率は現在の配列の長さの 50% になります。現在の配列の長さ コレクションでデータが使用されている場合、比較的大量のデータの場合、ベクトルの使用には一定の利点があります。
3. 指定された場所でデータを 見つけた場合、Vector と ArrayList は同じ時間を使用し、O(1) 時間がかかりますが、LinkedList は走査して検索する必要があり、O(i) 時間がかかります。最初の 2 つはそれほど効率的ではありません。
5.
Set インターフェイス
Map インターフェイス
Map インターフェイスは、3 種類のセット ビューを提供します。Map のコンテンツは、キー セットのセット、値セットのセット、またはキーと値のマッピングのセットと見なすことができます。
HashtableはMapインターフェースを継承し、キーと値のマッピングのハッシュテーブルを実装します。 null 以外の任意のオブジェクトをキーまたは値として使用できます。
データを追加するには put(key, value) を使用し、データを削除するには get(key) を使用します。これら 2 つの基本操作の時間コストは一定です。
ハッシュテーブルは、初期容量と負荷率という 2 つのパラメーターを通じてパフォーマンスを調整します。通常、デフォルトの負荷係数 0.75 を使用すると、時間と空間のバランスがより良くなります。負荷率を増やすとスペースを節約できますが、それに対応する検索時間が増加し、get や put などの操作に影響します。
キーとして使用されるオブジェクトはハッシュ関数を計算することによって対応する値の位置を決定するため、キーとして使用されるオブジェクトはすべて hashCode メソッドと equals メソッドを実装する必要があります。 hashCode メソッドと equals メソッドは、ルート クラス Object から継承されます。
ハッシュテーブルは同期です。
HashMap は Hashtable に似ていますが、HashMap が非同期で null、つまり null 値と null キーを許可する点が異なります。ただし、HashMap をコレクションとして扱う場合 (values() メソッドはコレクションを返すことができます)、その反復サブ操作の時間オーバーヘッドは HashMap の容量に比例します。したがって、反復操作のパフォーマンスが非常に重要な場合は、HashMap の初期容量を高く設定しすぎたり、負荷率を低く設定しすぎたりしないでください。
以上がJava フレームワークの使用法についての概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。