コレクションインターフェイス2(セットインターフェイス):
1.セット:順序付けされていない、繰り返せないコレクションを格納します。下部はリンクされたリストです
インターフェイス実装クラスを設定します。
1. HashSet:setインターフェースのメイン実装クラスとして、スレッドは安全ではなく、null値を格納できます
。2. LinkedHashSet:HashSetのサブクラスとして、内部データをトラバースするとき、追加の順序でトラバースできます。トラバース操作が頻繁に行われる場合、効率高
3. TreeSet:追加されたオブジェクトの指定された属性に従ってソートできます
まとめ
1. Setインターフェースで定義されている追加のメソッドはなく、それらはすべて、使用されているコレクションで宣言されているメソッドです。
2.要件1:Setにデータを追加する場合、データが配置されているクラスは、hashCode()およびequals()を書き換える必要があります–>通常、ショートカットを使用して
要件2 を生成します。一貫性:等しいオブジェクトは同じハッシュ値を持つ必要があります
1)==の場合、基本データ型
の変数に作用する場合は、格納された「値」が等しいかどうかを直接比較します。参照型の変数に作用する場合は、比較しますこれは
2を指すオブジェクトのアドレスです。equalsメソッドの
場合、equalsメソッドは基本データ型の変数に適用できないことに注意してください。equalsメソッドが書き換えられない場合、参照型の変数が指すオブジェクトのアドレスが比較されます。
StringやDateなどのクラスがequalsメソッドを書き換えると、ポイントされたオブジェクトのコンテンツが比較されます。
第二に、セットの実装プロセス
セット:順序付けされていない、繰り返し不可のセット(HashSet)を格納し
ます。1. 順序付け:ランダム性と等しくありません。
格納されるデータは、基になる配列の配列インデックスの順序では追加されませんが、データのハッシュ値に従って決定されます。
2.非反復性:等しい()に従って判断されたときに、追加された要素がtrueを返さないことを保証します。つまり、同じ要素は1つしか存在できません。
プロセスの要素を追加3.:根底にあるHashSetのを例と:配列+リスト(JDK7)
我々はHashSetの、最初のコールハッシュコード素子(のクラス)に要素を追加する方法を、ハッシュ値の要素が計算され、
このHA次に、Xixiは、アルゴリズムを通じてHashSetの下部にある配列の格納位置(つまり、インデックス位置)を計算
し、配列内のこの位置に要素があるかどうかを判断
します。この位置に要素がない場合、aは正常に追加されます。—>ケース1
この位置に別の要素bがある場合(またはリンクリストの形式で複数の要素がある場合)、要素aと要素bのハッシュ値を比較します。
ハッシュ値が異なる場合、要素aは正常に追加されます—>ケース2
ハッシュ値が同じで、要素aのクラスのequals()メソッドを呼び出すと、
equals()はtrueを返し、要素aの追加は失敗します。
equals()がfalseを返す場合、要素aは正常に追加されます。—>ケース3
追加が成功したケース2およびケース3の場合:要素aは既に存在します。指定されたインデックス位置のデータは、リンクリストの形式で保存されます
。Jdk7:要素aは、元の要素を指す配列に配置されます(ヘッダーの挿入)
JDK 8:アレイ内の元の要素、要素点a(テール付加)
要約:摂動
@Test
public void test(){
Set set = new HashSet();
set.add(123);
set.add(123);
set.add(456);
set.add("AA");
set.add("AA");
set.add("BB");
set.add(new Person("Tom",22));
set.add(false);
Iterator iterator = set.iterator();
while(iterator.hasNext()){
System.out.print(iterator.next() +"\t");
//AA BB Person{name='Tom', age=22} false 456 123
}
3、LinkedHashSetの使用
LinkedHashSetはHashSetのサブクラスとして、データを追加するときに、前のデータと後者のデータを記録する2つの参照も維持します
利点:頻繁な走査操作の高効率
@Test
public void test1(){
Set set = new LinkedHashSet();
set.add(123);
set.add(123);
set.add(456);
set.add("AA");
set.add("AA");
set.add("BB");
set.add(new Person("Tom",22));
set.add(false);
Iterator iterator = set.iterator();
while(iterator.hasNext()){
System.out.print(iterator.next() +"\t");
//123 456 AA BB Person{name='Tom', age=22} false
}
}
4、TreeSetの使用
1. TreeSetに追加されるデータには、同じクラスのオブジェクトが必要です
。2. 2つのソート方法:自然ソート(useクラスのComparableインターフェースを実装して、compareToメソッドをオーバーライドする)とカスタムソート
3.自然ソート:2つのオブジェクトの比較同じ標準は、compareTo()は0ではなく、()を返します。
@Test
public void test3(){
TreeSet set = new TreeSet();
//错误
// set.add(123);
// set.add(123);
// set.add(456);
// set.add("AA");
// set.add("AA");
// set.add("BB");
// set.add(new Person("Tom",22));
// set.add(false);
//一
// set.add(133);
// set.add(456);
// set.add(-145);
// set.add(12);
// set.add(6);
//二
// //详细可见Java集合框架(一)-----Collection接口中的Person类
set.add(new Person("Tom",23));
set.add(new Person("FAS",15));
set.add(new Person("SDF",45));
set.add(new Person("WER",32));
set.add(new Person("AF",20));
//如果compareTo没有重写年龄的话,就只会有一个对象
set.add(new Person("AF",50));
Iterator iterator = set.iterator();
while(iterator.hasNext()){
System.out.print(iterator.next() +"\t");
}
}
4. TreeSetのカスタムの順序
2つのオブジェクトが同じかどうかを比較するための標準は、次のとおりです。Comparatorのcompare()は0ではなく、()を返します
@Test
public void test4() {
Comparator com = new Comparator() {
//按照年龄从小到大排列
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof Person && o2 instanceof Person){
Person p1 = (Person)o1;
Person p2 = (Person)o2;
return Integer.compare(p1.getAge(),((Person) o2).getAge());
}else {
throw new RuntimeException("输入的类型不匹配!");
}
}
};
TreeSet set = new TreeSet(com);
set.add(new Person("Tom",23));
set.add(new Person("FAS",15));
set.add(new Person("SDF",45));
set.add(new Person("AEE",45));
set.add(new Person("WER",32));
set.add(new Person("AF",20));
//如果compareTo没有重写年龄的话,就只会有一个对象
set.add(new Person("AF",50));
Iterator iterator = set.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
練習
public static List duplicateList(List list){
HashSet set = new HashSet();
set.addAll(list);
return new ArrayList(set);
}
@Test
public void test5(){
List list = new ArrayList();
list.add(new Integer(1));
list.add(new Integer(2));
list.add(new Integer(2));
list.add(new Integer(3));
list.add(new Integer(3));
List list1 = duplicateList(list);
for (Object integer : list1){
System.out.println(integer);
}
}
@Test
public void test6(){
HashSet set = new HashSet();
Person p1 = new Person("AA",1001);
Person p2 = new Person("BB",1002);
set.add(p1);
set.add(p2);
p1.name = "CC";
set.remove(p1);
System.out.println(set);
set.add(new Person("CC",1001));
System.out.println(set);
set.add(new Person("AA",1001));
System.out.println(set);
}
}