ホームページ  >  記事  >  Java  >  Javaでのコレクションの詳しい説明

Javaでのコレクションの詳しい説明

黄舟
黄舟オリジナル
2017-03-13 17:28:292185ブラウズ



JavaコレクションはJavaによって提供されるツールキットであり、コレクション、リンクリスト、キュー、スタック、配列、マッピングなどの一般的に使用されるデータ構造が含まれています。 Java コレクション ツールキットの場所は java.util.*

Java コレクションは主に、List、Set、Map、およびツール クラス (Iterator、Enumeration、Array、および Collections) の 4 つの部分に分けることができます。

Java コレクション フレームワークは次のとおりです:


上の図からわかるように、Java フレームワークは主に Collection と Map です。

1. コレクションは、高度に抽象化されたコレクションである インターフェース です。 コレクションには List と Set の 2 つの分岐が含まれています:

1) リストは順序付けされたキューであり、最初の要素のインデックス値は 0 です。リスト実装クラスには、LinkedList、ArrayList、Vector、Stack が含まれます。

(1) LinkedList は List インターフェイスを実装し、要素を空にすることができます。これらの操作により、LinkedList をスタック、キュー、または双方向キューとして使用できるようになります。 LinkedList はスレッドセーフではありません。複数のスレッドが LinkedList に同時にアクセスする場合は、アクセスの同期を自分で実装する必要があります。または、別の解決策として、リストの作成時に同期されたリストを構築します。

(2) ArrayList は可変サイズの配列を実装し、すべての要素に

null

を含めることができ、ArrayList はスレッドセーフではありません。

(3) Vector は ArrayList に似ていますが、Vector はスレッドセーフです。 (4) スタックは Vector を継承し、後入れ先出しスタックを実装します。

Vector、ArrayLis、LinkedList の比較:

(1) Vector はスレッド セーフですが、ArrayList と LinkedList はスレッド セーフではありませんが、通常、スレッド セーフ要素は考慮されず、ArrayList と LinkedList の方が効率的です。

(2) ArrayList と Vector は動的配列に基づいたデータ構造を実装しますが、LinkedList はリンク リストに基づいたデータ構造です。 (3) 配列やリンクリストのクエリ、削除など。

2)、集合は要素の重複を許さない集合です。 set の実装クラスには Hashset と Treeset があります。 HashSet は HashMap に依存し、実際には HashMap を通じて実装されます。TreeSet は TreeMap に依存し、TreeMap を通じて実装されます。


2. Map は、

key

-value のキーと値のペアを使用するマッピング インターフェイスです。

AbstractMap は、HashMap、TreeMap、WeakHashMap のほとんどの API を実装する abstract クラス ですが、HashTable は Dictionary から継承しますが、Map インターフェースを実装します。


1)、HashTable

(1) HashTable は Map インターフェースを継承し、キーと値のマッピングのハッシュ テーブルを実装します。空でない任意の オブジェクト をキーまたは値として使用できます。

(2) データ put の追加とデータ get の削除にかかる時間のオーバーヘッドは一定です。

(3) キーとして使用されるオブジェクトはハッシュ 関数 を計算することによって対応する値の位置を決定するため、キーとして使用されるオブジェクトは hashCode メソッドと equals メソッドを実装する必要があります。 hashCode メソッドと equals メソッドはどちらもルート クラス Object から継承されます。

(4) HashTable はスレッドセーフです。


2)、HashMap

(1) HashMap は HashTable に似ていますが、HashMap は非スレッドセーフであり、キーと値の両方を空にすることができます。 S (2) Hashmap を Collection とみなした場合、その反復操作時間のオーバーヘッドは HashMap の容量に直接比例します。反復パフォーマンス操作が非常に重要である場合、HashMap の初期化容量が大きくなりすぎないようにする必要があります。


3)、TreeMap

(1) HashMap はハッシュコードを使用して、順序付けられていないコンテンツを迅速に検索しますが、TreeMap 内のすべての要素は特定の固定順序を維持し、順序付けされています。

(2) ツリーは常にバランスの取れた状態にあるため、TreeMap には調整オプションがありません。


4)、WeakHashMap

(1) WeakHashMap は、キーへの「弱参照」を実装する改良された HashMap であり、キーが外部から参照されなくなった場合、そのキーは GC によってリサイクルできます。

概要

(1) スタックやキューなどの操作が関係する場合は、要素の高速な挿入と削除のために List を考慮する必要があり、要素への高速なランダム アクセスが必要な場合は LinkedList を使用する必要があります。使用すべきです。

(2) プログラムがシングルスレッド環境にある場合、またはアクセスが 1 つのスレッドでのみ実行される場合は、より効率的な非同期クラスを検討してください。複数のスレッドが同時にクラスを操作できる場合は、同期クラスを使用する必要があります。使用済み。

(3) ハッシュテーブルの操作に特に注意してください。キーとして使用されるオブジェクトは、equals メソッドと hashCode メソッドを正しく上書きする必要があります。

(4) Map を使用する場合、検索、更新、削除、追加には HashMap または HashTable を使用するのが最適です。Map を自然な順序またはカスタム キーの順序で移動する場合は、TreeMap を使用するのが最適です。実際の型の代わりにインターフェイスに戻るようにしてください。たとえば、ArrayList の代わりに List を返します。これにより、将来 ArrayList を LinkedList に置き換える必要がある場合でも、クライアント コードを変更する必要がありません。これは抽象化のためのプログラミングです。

コレクションインターフェイスのソースコード

public interface Collection<E> extends Iterable<E> {
    int size(); //大小
    boolean isEmpty();//是否为空
    boolean contains(Object o); //是否包含某个对象
    Iterator<E> iterator(); //迭代
    Object[] toArray(); //转化为数组
    <T> T[] toArray(T[] a);
    boolean add(E e); //增加对象
    boolean remove(Object o); //删除对象
    boolean containsAll(Collection<?> c); //判断是否包含相同的Collection
    boolean addAll(Collection<? extends E> c); //将Collection追加到
    boolean removeAll(Collection<?> c); //删除所有相同对象
    default boolean removeIf(Predicate<? super E> filter) {
        Objects.requireNonNull(filter);
        boolean removed = false;
        final Iterator<E> each = iterator();
        while (each.hasNext()) {
            if (filter.test(each.next())) {
                each.remove();
                removed = true;
            }
        }
        return removed;
    }
    boolean retainAll(Collection<?> c);
    void clear();
    boolean equals(Object o);
    int hashCode();
    @Override
    default Spliterator<E> spliterator() {
        return Spliterators.spliterator(this, 0);
    }
    default Stream<E> stream() {
        return StreamSupport.stream(spliterator(), false);
    }
    default Stream<E> parallelStream() {
        return StreamSupport.stream(spliterator(), true);
    }
}

以上がJavaでのコレクションの詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。