java 集合三 Set


Set集合

Set子接口

特點:無序、無下標、元素不可重復

方法:全部繼承自Collection中的方法

Set子接口的使用

/**
* 特點:無序 不可重復
*/
public class Demo1 {
   public static void main(String[] args) {
       //創建集合
       Set<String> set = new HashSet<String>();
       //添加數據
       set.add("蘋果");
       set.add("西瓜");
       set.add("梨子");
       System.out.println(set.toString());
       //刪除
//       set.remove("蘋果");
//       System.out.println(set.toString());
       //遍歷[重點]
       //增強for
       for (String s : set) {
           System.out.println(s);
      }
       //迭代器
       Iterator<String> it = set.iterator();
       while (it.hasNext()){
           System.out.println(it.next());
      }
       //判斷
       set.contains("蘋果");
       set.isEmpty();
  }
}

Set實現類

  1. HashSet [重點]

    • 基於HashCode實現元素不重復

    • 存儲結構:哈希表(數組+鏈表+紅黑樹)

    • 當存入元素的哈希碼相同時,會調用equals進行確認,如果結果為true,則拒絕后者存入。

  2. TreeSet

    • 基於排列順序實現元素不重復

    • 實現了SortedSet接口,對集合元素自動排序

    • 元素對象的類型必須實現Comparable接口,指導排序規則

    • 通過ComparaTo方法確定是否為重復元素

HashSet使用

添加元素、刪除數據、遍歷操作、判斷操作可以和Set子接口的方類似

存儲過程:

  • 根據hashcode計算保存的位置,如果此位置為空,則直接保存,如果不為空則執行第二步

  • 使用equals方法、如果equals方法為true,則認為是重復,否則、形成鏈表

TreeSet使用

存儲結構:紅黑樹(二叉查找樹)

添加元素、刪除數據、遍歷操作、判斷操作可以和Set子接口的方類似

//要求:元素必須要實現Comparable接口
//compareTo()方法返回值為0,認為是重復元素
public class Demo1 {
   public static void main(String[] args) {
       TreeSet<Student> students = new TreeSet<>();
       Student s1 = new Student("張三", 20);
       Student s2 = new Student("李四", 20);
       Student s3 = new Student("王五", 20);
       students.add(s1);
       students.add(s2);
       students.add(s3);
       System.out.println("元素個數:"+students.size());
       System.out.println(students.toString());
  }
}

附:Student類

public class Student implements Comparable<Student>{
   private String name;
   private int age;

   public Student(String name, int age) {
       this.name = name;
       this.age = age;
  }

   public String getName() {
       return name;
  }

   public void setName(String name) {
       this.name = name;
  }

   public int getAge() {
       return age;
  }

   public void setAge(int age) {
       this.age = age;
  }

   @Override
   public String toString() {
       return "Student[" + "name='" + name + '\'' + ", age=" + age + ']';
  }

   //先按姓名比,再按年齡比
   @Override
   public int compareTo(Student o) {
       int n1 = this.getName().compareTo(o.getName());
       int n2 = this.getAge()-o.getAge();
       return n1==0 ? n2:n1;
  }
}

Comparator接口

Comparator:實現定制比較(比較器)

實現之后,可以不實現Comparable接口

public class Demo1 {
   public static void main(String[] args) {
       //創建集合,並指定比較規則
       TreeSet<Student> students = new TreeSet<>(new Comparator<Student>() {
           @Override
           public int compare(Student o1, Student o2) {
               int n1 = o1.getAge()-o2.getAge();
               int n2 = o1.getName().compareTo(o2.getName());
               return n1==0 ? n2:n1;
          }
      });
       Student s1 = new Student("xyz", 20);
       Student s2 = new Student("hello", 22);
       Student s3 = new Student("zhangsan", 25);
       Student s4 = new Student("lisi", 25);
       students.add(s1);
       students.add(s2);
       students.add(s3);
       students.add(s4);
       System.out.println("元素個數:"+students.size());
       System.out.println(students.toString());
  }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM