Javaコレクションフレームワーク(3)-Setインターフェース

コレクションインターフェイス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);
  }
}
19件のオリジナル記事を公開しました 賞賛されました0 訪問481

おすすめ

転載: blog.csdn.net/weixin_43244120/article/details/105497112