JAva.util.Set学習ノート

5972 ワード

概要
Setの概念は、数学的に同じ意味で、反復要素の存在を許さない特殊な集合であり、すなわち、条件e1.equals(e2)を満たす要素対e1およびe2を1つのSetに含まない.SetインタフェースはCollectionから継承されたインタフェースに基づいて,構造法,add法,equal法,hashcode法を主に含む追加の制限条件を追加した.説明の便宜上、Setインタフェースで宣言される方法は、Collectionで継承されたインタフェースを含む.
コンストラクションメソッドの制限は、すべてのコンストラクションメソッドが重複要素を含まないセットを構築する必要があります.注:変更しやすいオブジェクトのセットが含まれていることに特に注意してください.したがって、Setインタフェースでは、変更プロセスがセット内の別の要素と等しい場合の処理ポリシーは定義されていない.したがって,このような考慮から,集合は自己を1つの要素として自己に追加することはできない.この場合、次のテストクラスを作成します.

import java.util.HashSet;
import java.util.Set;

public class EqualClass {
    private int id;

    public EqualClass(int id) {
        this.id = id;
    }

    @Override
    public int hashCode() {
        return 1;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null || !(obj instanceof EqualClass)) {
            return false;
        }
        EqualClass o = (EqualClass) obj;
        return this.id == o.id;
    }

    @Override
    public String toString() {
        return "id " + this.id;
    }

    public static final void main(String[] args) {
        Set set = new HashSet();
        EqualClass class1 = new EqualClass(1);
        EqualClass class2 = new EqualClass(2);
        EqualClass class3 = new EqualClass(1);
        set.add(class1);
        set.add(class2);
        set.add(class3);
        System.out.println(class1.equals(class2));
        System.out.println(set);

        class2.setId(1);
        System.out.println(class1.equals(class2));
        System.out.println(set);
    }
}

出力結果は次のとおりです.
false
[id 2, id 1]
true
[id 1, id 1]

このことから,開始時にはclass 3とclass 1が等しいため,集合に追加した場合に重複要素は現れないことが分かる.一方、class 2は、集合に追加された後、class 1と等しいように変更されるが、集合に重複要素が排除されていないため、集合後の予期せぬ挙動を招く可能性があり、符号化においては、このような類似の状況が発生することに特に注意しなければならない.
一部のSetインタフェースの実装は、その中に含まれる要素に対して厳格な制限を有する.たとえば、null要素を許可しない実装もあれば、要素のタイプに制限がある実装もあります.条件を満たさない要素をセットに追加しようとすると、NullPointerExceptionまたはClassCastExceptionの非検査異常が放出されます.不正な要素を取得しようとすると、例外を放出しfalseを返す2つの処理方法があります.
方法の紹介
この文書では、Java.util.Collection学習ノートを参照して、Collectionとは異なるインタフェースについて説明します.
Iterator iterator();

Setの要素に基づく反復器を返します.リスト内の反復器とは異なり、セットの実装において結合要素の戻り順序のサポートが提供されない限り、Set反復器が要素を戻す順序は不定である.
boolean add(E e);

要素eをコレクションに追加します.この要素に等しい要素がセットに含まれている場合、この操作はセットに変更を加えずfalseを返します.Set実装クラスが提供する構造方法と組み合わせて,集合に重複する要素が含まれないことをある程度保証できる.しかし、これらの追加の制限は、集合がすべての要素を受信することを意味するものではありません.Setはnullなどの特殊な要素を拒否し、異常を放出する可能性があります.自分自身がSetインタフェースを実装する場合,その中に含まれる要素の制約条件を明確に説明する必要がある.
boolean addAll(Collection extends E> c);

集合cのすべての要素を指定したSetに追加します.追加中は、重量排出操作が必要です.cもSetである場合、addAll操作は数学における並列操作である.しかし、本方法を実行する過程で、c中の要素が変更されると、予期せぬ動作結果が生じる.
boolean retainAll(Collection> c);

Setにcに含まれる要素のみを保持し、Setの他の要素を削除します.cもSetである場合,本手法の動作結果は両者が交差をとることに相当する.
boolean removeAll(Collection> c);

セットcのすべての要素をSetから削除します.cもSetである場合,本手法の操作結果は数学における差セット操作に相当する.
boolean equals(Object o);

Setと対象oが等しいか否かを判定する.oもSetであり、Setと同じ要素が含まれている場合はtrueを返し、そうでなければfalseを返します.この方法は異なるSetインタフェース実装クラス間で等価比較を行う際の正確性を保証する.
int hashCode();

現在のSetのhash codeを計算します.1つのSetのハッシュ値は、現在のセットに含まれるすべての要素のハッシュ値の和である(null要素のハッシュ値は0と定義される).これは、任意の2つの集合s 1およびs 2について、s1.equals(s2)のときs1.hashCode()==s2.hashCode()があることを保証する.