Setインタフェースおよび実装サブクラスHashSet、LinkedHashSet、TreeSet

4084 ワード


SetインタフェースはCollectionのサブインタフェースであり、setインタフェースは追加の方法を提供していない.
Setコレクションに同じ要素を含めることはできません.同じSetコレクションに2つの同じ要素を追加しようとすると、追加操作に失敗します.
Setは,2つのオブジェクトが同じか否かを判断するには==演算子を用いるのではなく,equalsメソッドによる.
hashSet:
hashSetはSetインタフェースの典型的な実装であり、多くの場合、Setセットを使用してこの実装クラスが使用される.
hashsetはhashアルゴリズムに従ってセット内の要素を格納するため、アクセスと検索性能が優れている.
HashSetの特徴:
    エレメントの配列順序が保証されていません
     hashsetはスレッドが安全ではありません
     集合要素はnullであってもよい
Hashsetセットに要素が格納されている場合、HashSetはオブジェクトのhashCode()メソッドを呼び出してオブジェクトのhashCode値を取得し、hashCode値に基づいてオブジェクトのHashSetに格納される位置を決定します.
HashSet集合は2つの要素が等しいと判断する基準である:2つのオブジェクトはhashCode()メソッドによって比較的に等しく,2つのオブジェクトのequalsメソッドの戻り値も等しい.
 
 
package com.xatu.  ;

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


import org.junit.Test;

public class SetTest {
	@Test
	public void test() {
	Set s = new HashSet();
	s.add(new Integer(100));
	System.out.println("tisnjis"+s.add(150));
	System.out.println("tinajia2"+s.add(150));
	s.add("dfd");
	s.add(new String("dfd"));//        equals
	s.add(new String("xxx"));
	s.add(new Object());
	
	System.out.println("    "+s.size());
	System.out.println("   150"+s.contains(150));
	System.out.println("---------------");
	//    
	for (Object object : s) {
		System.out.println(object);
	}
	
	}
	
}

LinkedHashSetはHashSetのサブクラスです
LinkedHashSetは、要素のhashCode値に基づいて要素の格納場所を決定しますが、チェーンテーブルを使用して要素の順序を維持し、要素が挿入順序で保存されているように見えます.
LinkedHashSetの挿入性能はHashSetよりやや低いが,Set内のすべての要素に反復アクセスする際に優れた性能を有する.
LinkedHashSetでは、集合要素の重複は許可されません.
TreeSetはSortSetインタフェースの実装クラスであり、TreeSetはコレクション要素がソートされていることを保証します.
TreeSetの2つのソート方法:自然ソートとカスタムソート.デフォルトではTreeSetはナチュラルソートを採用しています
package com.xatu.  ;

import java.util.Set;
import java.util.TreeSet;

import org.junit.Test;

public class TreeSetTest {
	@Test
	public void testTerrSet() {
		Set set = new TreeSet();//       ,    
		set.add(200);
		//set.add("100");
		set.add(100);
		set.add(20);
		set.add(230);
		System.out.println(set);

	}
}

自然ソート:TreeSetは、要素間のサイズ関係を比較するために、集合要素のcompareTo(Object obj)メソッドを呼び出し、集合要素を昇順に並べ替えます.
TreeSetにオブジェクトを追加しようとすると、そのオブジェクトのクラスはComparableインタフェースを実装する必要があります.
Comparableを実装するクラスは、compareTo(Object obj)メソッドを実装する必要があります.2つのオブジェクトは、compareTo(Object obj)メソッドの戻り値によってサイズを比較します.
Comparableの典型的な実装:
BigDecimal、BigIntegerおよびすべての数値型に対応するパッケージクラス:対応する数値サイズで比較
Character:文字のunicode値で比較
Boolean:true対応パッケージクラスインスタンスfalse対応パッケージクラスインスタンスより大きい
TreeSetに要素を追加する場合、最初の要素だけがcompareTo()メソッドを比較する必要はありません.後で追加するすべての要素はcompareTo()メソッドを呼び出して比較します.
同じクラスの2つのインスタンスだけがサイズを比較するので、TreeSetに追加するのは同じクラスのオブジェクトである必要があります.
TreeSetセットの場合、2つのオブジェクトが等しいかどうかを判断する唯一の基準は、2つのオブジェクトがcompareTo(Object obj)メソッドで戻り値を比較することです.
1つのオブジェクトをTreeSetに入れ、そのオブジェクトに対応するequals()メソッドを書き換える必要がある場合、このメソッドはcompareTo(Object obj)メソッドと一致する結果を保証する必要があります.2つのオブジェクトがequals()メソッドで比較してtrueを返す場合、compareTo(Object obj)メソッドで比較して0を返す必要があります.
String:文字列の中の文字のunicode値でDate、Timeを比較する:後の時間、日付が前の時間、日付より大きい
TreeSetに要素を追加する場合、最初の要素だけがcompareTo()メソッドを比較する必要はありません.後で追加するすべての要素はcompareTo()メソッドを呼び出して比較します.
同じクラスの2つのインスタンスだけがサイズを比較するので、TreeSetに追加するのは同じクラスのオブジェクトである必要があります.
TreeSetセットの場合、2つのオブジェクトが等しいかどうかを判断する唯一の基準は、2つのオブジェクトがcompareTo(Object obj)メソッドで戻り値を比較することです.
1つのオブジェクトをTreeSetに入れ、そのオブジェクトに対応するequals()メソッドを書き換える必要がある場合、このメソッドはcompareTo(Object obj)メソッドと一致する結果を保証する必要があります.2つのオブジェクトがequals()メソッドで比較してtrueを返す場合、compareTo(Object obj)メソッドで比較して0を返す必要があります.
カスタムソート:
TreeSetの自然ソートは,集合要素の大きさに応じて,要素の昇順配列を行う.降順配列などのソートをカスタマイズする必要がある場合は、Comparatorインタフェースのヘルプを使用します.compare(T o 1,T o 2)メソッドを書き換える必要がある.
int compare(T o 1,T o 2)法を用いて、o 1とo 2の大きさを比較する:方法が正の整数を返すと、o 1がo 2より大きいことを示す;0を返すと、等しいことを示します.負の整数を返し、o 1がo 2より小さいことを示す.
カスタムソートを実装するには、実装ComparatorインタフェースのインスタンスをTreeSetのコンストラクタにパラメータとして渡す必要があります.
この場合、TreeSetに同じタイプのオブジェクトしか追加できません.そうでなければClassCastException異常が発生します.
カスタムソートを使用して、2つの要素が等しいと判断する基準は、2つの要素をComparatorで比較して0を返すことです.