Java Collection APIは、オブジェクトコレクションの保存と管理に役立つ列クラスとインターフェイスを提供します。実際、Javaのコレクションは配列のように機能しますが、コレクションのサイズは動的に変更でき、コレクションはより高度な機能を提供します。 Javacollection APIを使用すると、コレクションクラスを自分で作成する必要はありません。ほとんどのJavaコレクションクラスはjava.utilパッケージにあり、いくつかの並行性関連のコレクションクラスはjava.util.concurrentパッケージにあります。 Java APIが提供するコレクションクラスの一部を次に示します。
1。Javaコレクションの概要
Javaには2つのカテゴリがあります。
1。コレクション
2。マップ
コレクションクラスのコレクションは、主に単一のオブジェクトを保存するものとして理解できますが、マップクラスのコレクションは主にキー価値オブジェクトを保存します。これらの2つのカテゴリは、2つのインターフェイス、つまりCollection接口とMap接口に対応すると当然と考えることができます。次の写真には、これら2つのインターフェイスの継承ツリーがリストされています。
上記の写真から、コレクションインターフェイスが3つのブランチを導き出したことがわかります。
1。リスト
2。セット
3。キュー
マップは比較的単純で、ブランチは1つだけです。以下に、Javaコレクションの各実装クラスを詳細に紹介します。
注:コレクションとコレクションを区別するために、コレクションはコレクションへのインターフェイスであり、コレクションはツールクラスであり、両方ともjava.utilパッケージにあるコレクションインスタンスを操作できるようにする静的な方法を提供します。
2。最初にコレクションインターフェイスから紹介します
次の図は、コレクションインターフェイスのソースコードのスクリーンショットです。インターフェイス内の抽象的なメソッドから、一般的なコレクションの共通の方法を定義していることがわかります。
- 要素を追加して削除します
- 要素が存在するかどうかを判断します
- コレクションのサイズを取得します
- コレクションを反復します
2.1コレクションのリストインターフェイス
リストインターフェイスは、コレクションインターフェイスから継承されます。その特性は、その中のオブジェクトが順序付けられ、各オブジェクトに一意のインデックスがあることです。このインデックスを介して要素を検索でき、リスト内のオブジェクトを繰り返すことができます。これは配列に似ています。リストインターフェイスの場合、Java APIは次の実装を提供します。
-java.util.arraylist
-java.util.linkedList
-java.util.vector
-java.util.stack
もちろん、 java.util.concurrentパッケージにはいくつかの実装があります。これについては、別の記事で詳しく説明します。
ArrayListは最も一般的に使用されるコレクションであり、その内部実装はアレイであり、ArrayListのサイズを動的に拡張できます。要素のランダムアクセス効率は高く、アクセスの時間の複雑さはO(1)です。尾からの動作効率は高く、時間の複雑さはランダムアクセスのようにO(1)です。頭から動作する場合、効率は比較的低くなります。これは、ヘッドから挿入または削除する場合、次のすべての要素を移動する必要があり、時間の複雑さはO(ni)であるためです(nは要素の数を表し、要素の位置を表します)。
LinkList:上記の図からわかるように、 Listインターフェイスを継承するだけでなく、 Dequeインターフェイスを継承します(後で紹介されます)。 LinkListは、リンクリストに基づいたデータ構造であり、各ノードは前のノードと次のノードへのポインターを保存します。 LinkListは、ゼロからインデックス作成が必要であるため、ランダムアクセスに対して比較的非効率的であるため、時間の複雑さはO(i)です。ただし、要素の追加と削除の場合、フロントとバックのポインターのみを変更する必要があり、その時間の複雑さはO(1)であるため、リンクリストは効率的です。
Vector:VectorおよびArrayListソースコードのスクリーンショットから、それらはインターフェイスをまったく同じものに継承します。したがって、ベクトルは、アレイに基づいて実装されるスレッドセーフアレイリストと見なすことができますが、ほぼすべてのコレクション操作がsynchronizedキーワードで追加されます。
スタック:上記は、スタッククラスソースコードのスクリーンショットです。スタッククラスは実際にベクトルから継承されていることがわかります。 Stackは、ベクトルに基づいていくつかのメソッドを追加して、スタックの特性を提供するだけです(最初のLIFOで最後)。 Stackの機能は、追加すると、新しい要素が上部に追加され、削除されると、上部要素が最初に削除されることです。このデータ構造は、主に言語編集、XML解析などの特別なデータ処理プロセスとして使用されます。
2.2コレクションセットインターフェイス
セットとリストインターフェイスは、 Collectionインターフェイスからも継承され、コレクションの実装でもあります。それらの最大の違いは、セットのオブジェクトを繰り返すことができないことです。 Setインターフェイスの場合、Java APIは次の実装を提供します。
-java.util.enumset
-java.util.hashset
-java.util.linkedhashset
-java.util.treeset
これらのクラスの機能はわずかに異なり、違いは主にオブジェクトの反復の順序と挿入と検索の効率に反映されます。
ハッシュセットの実装は非常に単純であり、内部のHashMapですが、要素の順序を保証するものではありません。
LinkedHashsetの実装も非常にシンプルで、 LinkedHashMap内部で使用しています。 LinkedHashMap順序を維持するために内部的に双方向リンクリストを維持するため、 LinkedHashSetの特徴は、その中の要素が順序付けられ、元素反復の順序が挿入の順序であることです。要素の再挿入は、元の要素の順序に影響しません。
Treeset:上の図の継承関係から、最初にNavigableSet TreeSet SortedSetインターフェイスを理解する必要があります。
ソートセットインターフェイス
public interface sortedset <e> extends set <e> {comparator <? super e> comparator(); sortedset <e> subset(e fromelement、e toelement); sortedset <e> headset(e toelement); sortedset <e> tailset(e fromelement); e first(); }上記のインターフェイス定義から、sortedsetインターフェイスはセットのサブインターフェイスです。一般的なセット特性に加えて、その要素は内部的に順序付けられます。内部要素の順序は、要素の順序規則、つまり、要素の順序は、要素のcomparableインターフェイスまたはコンパレータcomparatorの実装に依存します。 Acparable ComparatorとComparatorの違いについては、https://www.vevb.com/article/93973.htmを参照してください。
Navigablesetインターフェイス
パブリックインターフェイスNavigableset <e> extends sortedset <e> {navigableset <e> descendingset(); iterator <e> descendingiterator(); sortedset <e> headset(e toelement); sortedset <e> tailset(e fromelement); sortedset <e> subset(e fromelement、e toelement);天井()、floor()、higher()、およびlower()...}Navigableset Interfaceの定義から、sortedsetのサブインターフェイスであり、いくつかのナビゲーション方法を提供します。これらのナビゲーション方法の意味については、Java Docを確認できます。
したがって、ツリーセットの特徴は、その内部要素が順序付けられており、実装する多くのナビゲーション方法があることです。 Java Collectionクラスの概要の最初の部分から、SetにはサブインターフェイスSortedSetがあり、SortedSetにはサブインターフェイスNavigableSetインターフェイスがあります。 Java APIは、sortedsetとnavigablesetインターフェイスのみを実装します。これはTreeSetです。
2.3コレクションのキューインターフェイス
キューインターフェイスは、順序付けられたキューを表すCollectionインターフェイスから継承します。ただし、このキューの最大の特徴は、新しく挿入された要素がキューのテールにあることであり、削除されたオブジェクトはキューのヘッドにあることです。これは、スーパーマーケットでチェックアウトするキューに似ています。
セクション1のJavaコレクションの概要から、キューインターフェイスにはサブインターフェイスDequeもあることをすでに知っています。 Java APIによるこれら2つのインターフェイスの定義を見てみましょう。
キューインターフェイス:
パブリックインターフェイスキュー<e>拡張コレクション<e> {boolean add(e e);ブールオファー(e e); e remove(); e Poll(); eピーク();}Deque Interface:
パブリックインターフェイスdeque <e> extends queue <e> {void addfirst(e e); void addlast(e e); e removeFirst(); e removeFirst();}これら2つのインターフェイスの定義から、誰もがいくつかの手がかりを見たと思います。キューインターフェイスは、一般的なキューの操作方法を定義しますが、Dequeは両端のキューです。
Queueインターフェイスの場合、Java APIは2つの実装を提供します。
-java.util.linkedList(Dequeインターフェイスも実装しています)
-java.util.priorityqueue
LinkedList:前のリストの章では、それが標準キューであると述べています。
PriorityQueue:キューの順序は、要素の順序ルール、つまり、比較可能なインターフェイスまたはコンパレータコンパレータへの要素の実装に応じて、Treesetに似ています。
Dequeインターフェイスの場合、LinkListクラス以外に別の実装があります。
-java.util.arraydeque
ArrayDeque:名前からわかるように、その内部実装は配列です。
3。Javaコレクションマップ
Java Collectionクラスの概要の最初の部分から、マップはコレクションインターフェイスから継承せず、コレクションインターフェイスと並列位置にあることがわかっています。したがって、MAPの動作は、上記のコレクションの動作とは大きく異なります。マップの主な機能は、それが保存する要素がkey-valueペアであることです。マップインターフェイスの定義を見てみましょう。
パブリックインターフェイスマップ<k、v> {v put(k key、v value); Boolean ContainsKey(オブジェクトキー); set <map.entry <k、v >> enterset(); int hashcode(); v get(オブジェクトキー); set <k> keyset(); ...}マップインターフェイスの場合、Java APIは次の実装を提供します。
-java.util.hashmap
-java.util.hashtable
-java.util.enummap
-java.util.identityhashmap
-java.util.linkedhashmap
-java.util.properties
-java.util.treemap
-java.util.weakhashmap
その中で、最も一般的に使用されるのはHashmapとTreemapです。
ハッシュマップの鍵と価値はどちらも無秩序です。ハッシュマップの内部実装は勉強する価値があります。詳細については、Hashmapの内部実装を参照してください
ハッシュテーブルは、ハッシュマップのヘビー級実装と見なすことができます。ほとんどのメソッドは、スレッドセーフである同期キーワードで追加されます。 HashTableとハッシュマップのもう1つの違いは、両方のハッシュマップのkey-valueがnullになり、 HashTable不です。
LinkedHashmapもハッシュマップですが、順序を維持するために双方向リンクリストが内部的に維持されます。 LinkedHashSet内部実装は、LinkedHashmapの使用に使用されます。
Treemapの鍵と価値は、順序を維持するだけでなく、 TreeSetとPriorityQueueに似ています。 Treemapのキーと価値の反復順序は、それぞれのソートルールに依存します。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。