線形テーブル、リンクされたリスト、およびハッシュテーブルは、一般的に使用されるデータ構造です。 Javaを開発するとき、JDKは基本的なデータ構造を実装するための一連の対応するクラスを提供してくれました。これらのクラスはすべてjava.utilパッケージにあります。この記事では、読者に各クラスの役割と、簡単な説明を通じて正しく使用する方法を説明しようとします。
コレクション├List│✜LinkedList│✜ArrayList│└VECTOR│└Stack
コレクションインターフェイス
コレクションは、最も基本的なコレクションインターフェイスです。コレクションは、一連のオブジェクト、つまりコレクションの要素(要素)を表します。一部のコレクションは同じ要素を許可しますが、他のコレクションはそうではありません。ソートできる人もいれば、できない人もいます。 Java SDKは、コレクションから直接継承されるクラスを提供していません。 Java SDKが提供するクラスはすべて、リストやセットなどのコレクションから継承される「サブインターフェイス」です。
コレクションインターフェイスを実装するすべてのクラスは、2つの標準コンストラクターを提供する必要があります。パラメーターレスコンストラクターを使用して空のコレクションを作成し、コレクションパラメーターコンストラクターを使用して、着信コレクションと同じ要素を持つ新しいコレクションを作成します。後者のコンストラクターにより、ユーザーはコレクションをコピーできます。
コレクション内のすべての要素を反復する方法は?コレクションの実際のタイプに関係なく、ITERATOR()メソッドをサポートします。Iterator()メソッドは、Iteratorを返し、このイテレーターを使用してコレクション内の各要素に1つずつアクセスします。
典型的な使用法は次のとおりです。
iterator it = collection.iterator(); //(it.hasnext()){object obj = it.next(); //次の要素を取得}コレクションインターフェイスから派生した2つのインターフェイスはリストとセットです。
リストインターフェイスをリストします
リストは順序付けられたコレクションであり、このインターフェイスを使用すると、各要素挿入の位置を正確に制御できます。ユーザーは、インデックス(リスト内の要素の位置、アレイサブスクリプトと同様)を使用して、Javaの配列に似たリスト内の要素にアクセスできます。
以下のセットとは異なり、リストは同じ要素を許可します。
必要なiterator()メソッドを持つIterator()メソッドに加えて、リストはListIterator()メソッドも提供し、ListIteratorインターフェイスを返します。標準のイテレーターインターフェイスと比較して、ListIteratorはADD()などのより多くの方法を備えており、追加、削除、要素の設定、前方または後方の移動を可能にします。
リストインターフェイスを実装する一般的なクラスには、LinkedList、ArrayList、Vector、Stackが含まれます。
LinkedListクラス
LinkedListはリストインターフェイスを実装し、null要素を許可します。さらに、LinkedListは、LinkedListのヘッダーまたはテールに追加の取得、削除、挿入、挿入を提供します。これらの操作により、LinkedListはスタック、キュー、または双方向キューとして使用できます。
LinkedListには同期方法がないことに注意してください。複数のスレッドが同時にリストにアクセスする場合、自分でアクセス同期を実装する必要があります。 1つの解決策は、それを作成するときに同期リストを構築することです。
リストリスト= collections.synchronizedList(new LinkedList(...));
ArrayListクラス
ArrayListは可変サイズの配列を実装します。 nullを含むすべての要素が可能になります。 ArrayListは同期されていません。
サイズの実行時間、ISEMPTY、GET、SETメソッドは一定です。ただし、ADDメソッドのオーバーヘッドは償却定数であり、N要素を追加するのにO(n)時間がかかります。他の方法には線形実行時間があります。
各ArrayListインスタンスには容量があり、これは要素を保存するために使用される配列のサイズです。この容量は、新しい要素が絶えず追加されると自動的に増加する可能性がありますが、成長アルゴリズムは定義されていません。多数の要素を挿入する必要がある場合、挿入効率を向上させるためにアレイリストの容量を増やすために挿入する前に、surecapacityメソッドを呼び出すことができます。
LinkedListと同様に、ArrayListも同性化されていません。
ベクトルクラス
ベクトルはArrayListに非常に似ていますが、Vectorは同期しています。ベクトルによって作成されたイテレーターは、アレイリストによって作成された反復ターと同じインターフェイスです。ベクトルが同期しているため、1つのイテレーターが作成されて使用されているため、別のスレッドがベクトルのステータスを変更します(たとえば、いくつかの要素の追加または除去)。
スタッククラス
スタックはベクトルから継承し、最終的な最初のスタックを実装します。 Stackは、ベクトルをスタックとして使用できるようにする5つの追加方法を提供します。基本的なプッシュメソッドとピークメソッドは、スタックの上部に要素を取得し、空のメソッドはスタックが空であるかどうかをテストし、検索方法はスタック内の要素の位置を検出します。スタックは作成されたばかりで、空のスタックです。
インターフェイスを設定します
SETは、重複要素を含むコレクションです。つまり、E1とE2にはE1.Equals(E2)= Falseがあり、SETには最大1つのnull要素があります。
明らかに、Setのコンストラクターには制約があり、合格したコレクションパラメーターには重複要素を含めることはできません。
注意:可変オブジェクトは注意して操作する必要があります。セット内の可変要素が独自の状態を変更すると、Object.equals(object)= Trueを引き起こし、いくつかの問題を引き起こします。
マップインターフェイス
MAPはコレクションインターフェイスを継承しておらず、MAPはキーから値へのマッピングを提供することに注意してください。マップには同じキーを含めることはできません。各キーは1つの値のみをマッピングできます。マップインターフェイスは、コレクションの3種類のビューを提供します。マップのコンテンツは、キーコレクションのセット、価値コレクションのセット、またはキー価値マッピングのセットと見なすことができます。
ハッシュテーブルクラス
ハッシュテーブルは、キー価値マッピングを備えたハッシュテーブルを実装するためにマップインターフェイスを実装します。非ヌルオブジェクトは、キーまたは値として使用できます。
put(key、value)を使用してデータを追加し、Get(key)を使用してデータを取得します。これら2つの基本操作のオーバーヘッドは一定です。
ハッシュテーブルは、初期容量と負荷因子パラメーターを通じてパフォーマンスを調整します。通常、デフォルトの負荷係数0.75は、時間とスペースのバランスをより適切に実現できます。負荷係数を増やすとスペースを節約できますが、対応する検索時間は増加し、GetやPutなどの操作に影響します。
ハッシュテーブルを使用する簡単な例は次のとおりです。1、2、および3をハッシュテーブルに入れ、それらのキーはそれぞれ「1」、「2」、「3」です。
ハッシュテーブル番号= new Hashtable();
numbers.put( "one"、new Integer(1));
numbers.put( "2"、new Integer(2));
numbers.put( "3"、new Integer(3));
2などの番号を取得するには、対応するキーを使用します。
integer n =(integer)numbers.get( "2");
System.out.println( "2 =" + n);
キーとしてのオブジェクトは、ハッシュ関数を計算することにより対応する値の位置を決定するため、キーとしてのオブジェクトはハッシュコードを実装し、メソッドに等しくなります。ハッシュコードと等しいメソッドは、ルートクラスオブジェクトから継承されます。カスタムクラスをキーとして使用する場合は、非常に注意してください。ハッシュ関数の定義によれば、2つのオブジェクトが同じ場合、つまりobj1.equals(obj2)= trueである場合、ハッシュコードは同じでなければなりませんが、2つのオブジェクトが異なる場合、ハッシュコードは変わらない場合があります。 2つの異なるオブジェクトのハッシュコードが同じ場合、この現象は競合と呼ばれます。競合により、ハッシュテーブルの操作の時間オーバーヘッドが増加します。したがって、HashCode()メソッドを定義して、Hashテーブルの動作を高速化してください。
同じオブジェクトに異なるハッシュコードがある場合、ハッシュテーブルの操作には予期しない結果が得られます(予想されるGETメソッドはnullを返します)。この問題を回避するには、1つのことを覚えておく必要があります。そのうちの1つを書くのではなく、同時にHashcodeメソッドを書き直す必要があります。
ハッシュテーブルは同期されます。
ハッシュマップクラス
ハッシュマップはハッシュテーブルに似ていますが、違いは、ハッシュマップが非同期であり、null、つまりヌル値とヌルキーを可能にすることです。 、しかし、ハッシュマップがコレクション(値()メソッドがコレクションを返すことができる)と見なされる場合、その反復サブオペレーション時間オーバーヘッドはハッシュマップの容量に比例します。したがって、反復操作のパフォーマンスが非常に重要である場合、ハッシュマップの初期化容量を高すぎるように設定しないか、負荷係数が低すぎないようにしないでください。
WeakHashmapクラス
WeakHashmapは、キーへの「弱い参照」を実装する改善されたハッシュマップです。キーが外部から参照されなくなった場合、キーはGCによってリサイクルできます。
要約します
スタック、キュー、その他の操作が関与している場合は、リストの使用を検討する必要があります。迅速に挿入して削除する必要がある要素の場合、LinkedListを使用する必要があります。要素に迅速にアクセスする必要がある場合は、ArrayListを使用する必要があります。
java.util.collectionsクラスパッケージ
java.util.collectionsクラスには、プログラマーの作業を容易にすることができる多くの有用な方法が含まれていますが、これらの方法は通常、十分に活用されていません。 Javadocは、コレクションクラスの最も完全な説明を示しています。「このクラスには、コレクションを操作または返すことができる専用の静的クラスが含まれています。
」1.2メソッドが含まれています
イテレーター、アレイリスト、要素、バッファー、マップ、コレクション
リージ:
java.util.arraylistをインポートします。 java.util.collectionをインポートします。 java.util.collectionsをインポートします。 java.util.comparatorをインポートします。 java.util.listをインポートします。 public class collectionsSort {public collectionssort(){} public static void main(string [] args){double array [] = {111、111、23、456、231};リストリスト= new arrayList(); Lis li = new arrayList(); for(int i = 0; i <array.length; i ++){list.add(new double(array [i])); //list.add("+Array [i]); } double arr [] = {111}; for(int j = 0; j <arr.length; j ++){li.add(new double(arr [j])); }}2。特定の操作
1)ソート(ソート)
ソートメソッドを使用して、要素の自然な順序に従って、指定されたリストを昇順で並べ替えます。リスト内のすべての要素は、同等のインターフェイスを実装する必要があります。このリストのすべての要素は、指定されたコンパレータを使用して互いに比較する必要があります
double array [] = {112、111、23、456、231}; for(int i = 0; i <array.length; i ++){list.add(new double(array [i])); } collections.sort(list); for(int i = 0; i <array.length; i ++){system.out.println(li.get(i)); } //結果:112,111,23,456,2312)シャッフル
ハイブリッド配置アルゴリズムは、ある種の正反対を実行します。リストに記載されている可能性のある順列を破壊します。つまり、リストはランダムソースの入力に基づいて再配置されます。そのような配置には同じ可能性があります(ランダムソースが公正であると仮定します)。このアルゴリズムは、運のゲームを実装するのに非常に役立ちます。たとえば、カードのデッキを表すカードオブジェクトのリストを混ぜるために使用できます。さらに、テストケースを生成するときにも非常に便利です。
collections.shuffling(list)double array [] = {112、111、23、456、231}; for(int i = 0; i <array.length; i ++){list.add(new double(array [i])); } collections.shuffle(list); for(int i = 0; i <array.length; i ++){system.out.println(li.get(i)); } //結果:112,111,23,456,2313)逆
リバースメソッドを使用して、指定されたリストを元素の自然な順序に従って降順で並べ替えます。
collections.reverse(list)double array [] = {112、111、23、456、231}; for(int i = 0; i <array.length; i ++){list.add(new double(array [i])); }コレクション。 Reverse(list); for(int i = 0; i <array.length; i ++){system.out.println(li.get(i)); } //結果:231,456,23,111,112 4)指定されたリスト内のすべての要素を指定された要素に置き換えます。 string str [] = {"dd"、 "aa"、 "bb"、 "cc"、 "ee"}; for(int j = 0; j <str.length; j ++){li.add(new String(str [j])); } collections.fill(li、 "aaa"); for(int i = 0; i <li.size(); i ++){system.out.println( "list [" + i + "] =" + li.get(i)); } // result:aaa、aaa、aaa、aaa5)コピー(コピー)
ターゲットリストとソースリストの2つのパラメーターを使用して、ソース要素をターゲットにコピーし、その内容を上書きします。ターゲットリストは、少なくともソースと同じくらい長くなります。長い場合、ターゲットリストの残りの要素は影響を受けません。
collections.copy(list、li):後者のパラメーターはターゲットリスト、前のパラメーターはソースリストです
double array [] = {112、111、23、456、231};リストリスト= new arrayList(); Lis li = new arrayList(); for(int i = 0; i <array.length; i ++){list.add(new double(array [i])); } double arr [] = {1131,333}; string str [] = {"dd"、 "aa"、 "bb"、 "cc"、 "ee"}; for(int j = 0; j <arr.length; j ++){li.add(new double(arr [j])); } collections.copy(list、li); for(int i = 0; i <list.size(); i ++){system.out.println( "list [" + i + "] =" + list.get(i)); } //結果:1131,333,23,456,2316)コレクションの最小の要素(最小)を返します
指定されたコンパレータが生成される順序に従って、指定されたコレクションの最小要素を返します。コレクション内のすべての要素は、指定されたコンパレータを介して互いに比較する必要があります
collections.min(list)double array [] = {112、111、23、456、231};リストリスト= new arrayList(); for(int i = 0; i <array.length; i ++){list.add(new double(array [i])); } collections.min(list); for(int i = 0; i <list.size(); i ++){system.out.println( "list [" + i + "] =" + list.get(i)); } //結果:237)コレクションの最小要素(最大)を返します
指定されたコンパレータが生成される順序に従って、指定されたコレクションの最大要素を返します。コレクション内のすべての要素は、指定されたコンパレータを介して互いに比較する必要があります
collections.max(list)double array [] = {112、111、23、456、231};リストリスト= new arrayList(); for(int i = 0; i <array.length; i ++){list.add(new double(array [i])); } collections.max(list); for(int i = 0; i <list.size(); i ++){system.out.println( "list [" + i + "] =" + list.get(i)); } //結果:4568)lastindexofsublist
指定されたソースリストに最後に表示された指定されたターゲットリストの開始位置を返します
int count = collections.lastindexofsublist(list、li); double array [] = {112、111、23、456、231};リストリスト= new arrayList(); Lis li = new arrayList(); for(int i = 0; i <array.length; i ++){list.add(new double(array [i])); } double arr [] = {111}; string str [] = {"dd"、 "aa"、 "bb"、 "cc"、 "ee"}; for(int j = 0; j <arr.length; j ++){li.add(new double(arr [j])); } int locations = collections。 lastindexofsublist(list、li); System.out.println( "==="+ locations); //結果39)Indexofsublist
指定されたターゲットリストが指定されたソースリストに初めて表示されるときの開始位置を返します
int count = collections.indexofsublist(list、li); double array [] = {112、111、23、456、231};リストリスト= new arrayList(); Lis li = new arrayList(); for(int i = 0; i <array.length; i ++){list.add(new double(array [i])); } double arr [] = {111}; string str [] = {"dd"、 "aa"、 "bb"、 "cc"、 "ee"}; for(int j = 0; j <arr.length; j ++){li.add(new double(arr [j])); } int locations = collections.indexofsublist(list、li); System.out.println( "==="+ locations); //結果110)回転します
指定された距離に基づいて、指定されたリスト内のサイクルに移動する要素
collections.rotate(list、-1);
それが負の数である場合、それは積極的に動き、肯定的に動くと肯定的に動きます。
double array [] = {112、111、23、456、231};リストリスト= new arrayList(); for(int i = 0; i <array.length; i ++){list.add(new double(array [i])); } collections.rotate(list、-1); for(int i = 0; i <list.size(); i ++){system.out.println( "list [" + i + "] =" + list.get(i)); } //結果:111,23,456,231,112上記の記事では、Javaの一般的に使用されるデータ構造の実装クラスの収集とマップについて簡単に説明します。これは私があなたと共有したすべてのコンテンツです。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。