Javaの基本のコレクション

リストコレクション

各要素は、その対応するインデックス順序を有する順序付けられた、反復可能組のセットの要素のリスト。

単にequalsメソッドを比較することで、二つの等しいオブジェクトを分析一覧はtrueを返します。

例を見てください:

public class A {
    public boolean equals(Object obj) {
        return true;
    }
}

import java.util.ArrayList;
import java.util.List;

public class ListTest2 {
    public static void main(String[] args) {
        List books = new ArrayList();
        books.add(new String("a"));
        books.add(new String("b"));
        books.add(new String("c"));
        System.out.println(books);
        books.remove(new A());
        System.out.println(books);
        books.remove(new A());
        System.out.println(books);
    }
}

あなたは、オブジェクトを削除しようとするとされ、リストAは、オブジェクトが要素のセットを比較するために、equalsメソッドを呼び出します。パラメータなどの要素の集合にequalsメソッド場合はtrueを返し、リストの要素を削除します。ここではequalsメソッドの書き換えは常にtrueを返し、そうするたびにリストのコレクションから要素を削除します。

ArrayListのクラス

ArrayListのクラスは、完全に以前のListインタフェースを説明する機能のすべてをサポートし、クラスの配列ベースのリストの実装です。

ArrayListのパッケージ動的な再分配可能オブジェクト[]配列。

セットコレクション

HashSetのクラス

  • いいえ配列要素ない、要素がnull設定された値であってもよいです

  • によって同期コードを確認する必要がありHashSetのコレクションを、修飾同時に複数のスレッドを想定し、HashSetのに同期していない場合

二つのオブジェクトのハッシュコードは、()の値が等しい返しながらHashSetの同じ要素は、2つのオブジェクトを比較することにより、同等のequals()を基準にしている決定します。

ハッシュコードとは、そのような慣習に沿って等しい:真の等号を返し、ハッシュコードは同じでなければなりません。この大会でのJavaコードの多くの図書館は、HashSetのように、これらの2つの方法を使用しています。私たちが尋ねる理由は、クラスがhashCodeメソッドをオーバーライドする場合は、あなたがequalsメソッドをオーバーライドする必要があり、ラインでの合意との履行を確保することです

収集要素にHashSetのは、HashSetのは、オブジェクトのhashCodeの目標値を得るためにハッシュコード()メソッドを呼び出し、そのオブジェクトの位置を決定する際にHashSetのハッシュコード値に応じて格納されています。

各スロットは、バケットと呼ばれるHashSetの要素(バケット)を格納することができます。同じハッシュコードの要素が複数の値が、それらは偽等しい比較法によって返された場合、パフォーマンスの低下を引き起こす可能性が、バケット内の複数の要素を配置する必要があります。それは、あなたがクラスのHashSetのコレクションにオブジェクトを保存することをお勧めしますされると、クラスの書き換えが等しいとhashCodeメソッド、trueを返すことを保証しようとする2つのオブジェクトを比較することにより、equalsメソッドを、自分のhashCodeメソッドは同じ値を返します。

HashSetの変数にオブジェクトを追加するとき、あなたは特に注意する必要があり、そうでない場合は、正しくこれらのコレクション要素にアクセスすることはできませんHashSetのにつながる、計算のhashCode()、インスタンス変数に等しい()メソッドに関わる変数オブジェクトを変更しないようにしてください。

例を見てください:

public class R {
    int count;
    public R(int count) {
        this.count = count;
    }
    public String toString() {
        return "R[count:" + count + "]";
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj != null && obj.getClass() == R.class) {
            R r = (R)obj;
            return this.count == r.count;
        }
        return false;
    }
    public int hashCode() {
        return this.count;
    }
}

import java.util.HashSet;
import java.util.Iterator;

public class HashSetTest2 {
    public static void main(String[] args) {
        HashSet hs = new HashSet();
        hs.add(new R(5));
        hs.add(new R(-3));
        hs.add(new R(9));
        hs.add(new R(-2));
        System.out.println(hs);
        Iterator it = hs.iterator();
        R first = (R)it.next();
        first.count = -3;
        System.out.println(hs);
        hs.remove(new R(-3));
        System.out.println(hs);
        System.out.println("hs 是否包含 count 为 -3 的 R 对象" + hs.contains(new R(-3)));
        System.out.println("hs 是否包含 count 为 -2 的 R 对象" + hs.contains(new R(-2)));
    }
}

/*
[R[count:-2], R[count:-3], R[count:5], R[count:9]]
[R[count:-3], R[count:-3], R[count:5], R[count:9]]
[R[count:-3], R[count:5], R[count:9]]
hs 是否包含 count 为 -3 的 R 对象false
hs 是否包含 count 为 -2 的 R 对象false
*/

LinkedHashSetのクラス

LinkedHashSetのHashSetのサブクラスは同様の要素ハッシュコード値の格納位置に基づいて決定されます。LinkedHashSetのは、要素のコレクションを横断したときに、LinkedHashSetのは、要素の順序の要素を追加することによって、コレクションを訪問するように、しかし、要素のリストを使用するには、秩序を維持します。

LinkedHashSetのは、挿入秩序を維持する必要があり、パフォーマンスがHashSetのよりわずかに低かったが、すべての要素の反復で設定してアクセスするとき、それは内部の秩序を維持するために一覧表示するので、良好な性能を持っています。

TreeSetのクラス

名前は、これは設定コレクションの一種であることを示唆しているようTreeSetのにSortedSetインタフェースの実装クラスは、あります。

TreeSetの要素のコレクションを格納するために使用TreeMapの実装、赤黒木データ構造の基礎となります。自然の並べ替えやカスタムオーダー:TreeSetのは、二つの並べ替え方法をサポートしています。デフォルトでは、自然順序付けを使用しました。

自然順序

Javaは、インターフェイスがのcompareTo(オブジェクトobj)メソッドを定義して、同等のインタフェースを提供します。インターフェイスを実装するクラスは、抽象メソッドを実装する必要があります。

以下の通りのcompareTo(オブジェクトobj)比較ルールは以下のとおりです。

  • obj1.compareTo(OBJ2)が等しい示し、0の値を返します
  • obj1.compareTo(OBJ2)はOBJ1> OBJ2を示し、0より大きい値を返します
  • obj1.compareTo(OBJ2)はOBJ1 <OBJ2を示す、0未満の値を返します

TreeSetの要素の大きさとの関係を比較する要素のcompareTo(オブジェクトobj)メソッドのセットを呼び出す、次いで昇順の要素のセットが、これは自然な順序です。だから、自然要素オブジェクトの並べ替えは、Comparableインタフェースを実装する必要があります。

2つのオブジェクトのcompareTo(オブジェクトOBJ)を比較することにより等しい場合、すなわち、戻り値は、それらが同じであること、TreeSetの0であり、新しいオブジェクトは、収集TreeSetのに追加されません。

あなたはTreeSetのが正常に動作する場合、TreeSetのは、同じタイプのオブジェクトを追加することができます。

カスタムの並べ替え

カスタムの並べ替えをしたい場合は、あなたがオブジェクトのTreeSetの収集、コンパレータTreeSetのに関連付けられているオブジェクトのコレクションを作成するときに必要です。コンパレータインターフェースは関数であり、式ではなく、ラムダを用いてもよいです。

並べ替えをカスタマイズすることで、今でもそうでない場合にClassCastException例外TreeSetの、に異なるタイプのオブジェクトを追加することはできません。コンパレータは、2つの要素0を比較することによって返されるので、第二の要素がコレクションに追加TreeSetのない:この時点で、要素のセットは、二つの基準に等しく決定されます。

import java.util.TreeSet;

public class TreeSettest4 {
    public static void main(String[] args) {
        TreeSet ts = new TreeSet((o1, o2) -> {
            M m1 = (M) o1;
            M m2 = (M) o2;
            return m1.age > m2.age ? -1 : m1.age < m2.age ? 1: 0;
        });
        ts.add(new M(5));
        ts.add(new M(-3));
        ts.add(new M(9));
        System.out.println(ts);
    }
}

tsのコレクションをソートするための責任があるラムダ式のコンパレータのための上記のターゲット・タイプを使用します。Comparableインタフェースを実装することなく、すべてのMクラスが、ラムダ式のTreeSetの関連付けを担当する要素の一種。

compareToメソッドを実装する場合、強くそうでない場合はいくつかの奇妙なエラーが発生する可能性があり、等号の結果と一致してお勧めします。いくつかは、天然x.compareTo(Y)== 0のある種の使用が決定され、再現性を決定するために等しいので、クラスがあります。compareToは同じ要素かどうか、判断順序位置するので、意思決定が等しいかを決定することです等しい、平等の一種で要素の位置を決定することであるので、我々は同じでなければなりません等しい注文非常に同じ位置を、確認する必要があります。

EnumSetのクラス

EnumSetのがEnumSetの内のすべての要素が列挙型列挙クラスを指定する必要があり、列挙クラスのデザインのコレクションのために設計され、列挙型は、EnumSetの作成の中で明示的または暗黙的に指定します。

コレクション要素をEnumSetのは、クラス列挙コレクション要素を決定するために、列挙値の配列を命じています。EnumSetのコレクションがnull要素の挿入を許可していません。

内部EnumSetのは、コンパクトで効率的な、非常に小さなメモリフットプリント、高い動作効率の形で格納されたビットベクトルとして表されます。特に、コールのcontainsAllのretainAll方法及び時間などのバルク操作中。

地図コレクション

定義された:片道1人の関係がキーと値の間に存在するマッピング関係を有するデータを格納するための地図は、キーは一意である必要があります。

設定と地図との関係は、非常に接近している場合、それがどこにあるキーは、それを価値クライアントのキー値として、キーと値のペア。これは御馳走として設定されたマップに処理することができます。

確かに、マップエントリは、内部キーと値のペアをカプセル化するクラスを提供し、キーエントリのエントリ・ストレージ・パッケージの計算のみを考慮します。ビューのソースコードの観点から、Javaは地図を達成することである、そしてNULL値のすべてをパッケージ化により、マップセットのコレクション上で実現されます。

HashMapの実装クラス

キーオブジェクトとして使用されるハッシュマップは、ハッシュコード()メソッドとequals()メソッドを実装しなければなりません。

同じハッシュマップに二つの重要な基準を分析する2つのequals()メソッドを比較することによって、真の鍵を返し、ハッシュコード2のキー値も同じです。

HashMapの二つの等しい値決意基準:()メソッドはtrue 2つのオブジェクトが等しいを渡すことができ返します。

キーとしてHashMapのカスタムクラスを使用する場合とHashSetのは、同様に、オーバーライドされた等号()メソッドとhashCode()メソッドの場合は、基準、すなわち、ときに、2つの等しい(でキー、一貫性の二つの方法であるべきですこの方法は、真の比較を返す)と、2つのキーのhashCode()メソッドは、値が同じでなければならない返します。

HashSetのと同様に、使用している場合、プログラムの重要な変数としてオブジェクトを変更しないようにしてください、その後、キーのHashMapのように、可変オブジェクトを使用しないようにしてください。

LinkedHashMap実装クラス

LinkedHashMapはまた、キーと値のペアの順序を維持するために、二重リンクリストを使用して地図、キーと値のペアの挿入順序と一致し繰り返し順序のリスト反復秩序を維持する責任がある、(実際にはキーの順序を考慮する必要があります)。

import java.util.LinkedHashMap;

public class LinkedHashMapTest {
    public static void main(String[] args) {
        LinkedHashMap scores = new LinkedHashMap();
        scores.put("Chinses", 80);
        scores.put("English", 82);
        scores.put("Math", 76);
        scores.forEach((key ,value) -> System.out.println(key + "--->" + value));
    }
}

TreeMapの実装クラス

TreeMapのは赤黒木データ構造、即ち、赤黒木ノードとして各キーと値のペアです。TreeMapの格納されたキーと値のペアのノードは、ノードがキーをソートする必要があります。TreeMapのは、秩序状態のとき、すべてのキーと値のペアを確保することができます。

並べ替え二種類:

  • 自然順序:それ以外の場合はClassCastExceptionがスローされます、すべてのキーのTreeMapはComparableインタフェースを実装する必要があり、すべてのキーが同じクラスのオブジェクトでなければなりません。
  • カスタムの並べ替え:あなたはTreeMapのを作成すると、すべてのキーのTreeMapがソートされているために責任があるコンパレータオブジェクトを渡します。Comparableインタフェースを実装するカスタムの並べ替えキーを使用するときにマップが必要とされていません

TreeMapの決意は、二つの鍵となる基準に等しい2つのキー戻りcompareToメソッドにより0。

あなたは、キーのTreeMapとしてカスタムクラスを使用する場合TreeSetのと同じように、我々は、TreeMapの良い仕事をできるようにするためには、等号()メソッドとのcompareTo()メソッドを書き換えるの種類を一貫性のある結果を維持しなければならない2つのキーの比較には、equalsメソッドを0を返す必要がありcompareToメソッドによってそれらを比較し、trueを返します。

compareToメソッドを実装する場合、強くそうでない場合はいくつかの奇妙なエラーが発生する可能性があり、等号の結果と一致してお勧めします。いくつかは、天然x.compareTo(Y)== 0のある種の使用が決定され、再現性を決定するために等しいので、クラスがあります。compareToは同じ要素かどうか、判断順序位置するので、意思決定が等しいかを決定することです等しい、平等の一種で要素の位置を決定することであるので、我々は同じでなければなりません等しい注文非常に同じ位置を、確認する必要があります。

公式ドキュメント:

Comparableを実装するほとんどのJavaコアクラスは、equalsと一貫性のある自然順序付けを持っています。

EnumMap実装クラス

キーは、EnumMap、単一の列挙クラスの列挙値でなければなりません。

EnumMapは、次の特性があります。

  • EnumMapはアレイとして内部的に格納されています

  • キーと値のペアの順序を維持するための鍵EnumMap天然の配列(列挙クラスの列挙値の、すなわち、配列)

  • EnumMapキーの値がnullとしてではありません

あなたはクラスEnumMapを作成するときには、列挙を指定する必要があり、したがって、EnumMapは、関連する列挙クラスを指定しました。

私は公共の数の関心を歓迎します

おすすめ

転載: www.cnblogs.com/Tianny/p/11619659.html