Set集合的使用


set集合

package org.example.set;

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

/*
* Set 集合特點
*   不包含重復元素的集合
*   沒有帶索引的方法,所以不能使用普通for循環遍歷*/
public class SetDemo {
   public static void main(String[] args) {
       // 創建集合對象
       Set<String> set=new HashSet<>();
       //添加元素
       set.add("zhangsan");
       set.add("lisi");
       set.add("wangwu");
       //不包含重復元素,插入重復元素無效
       set.add("lisi");
       //遍歷set
       for (String item : set) {
           System.out.println(item);//輸出lisi,zhangsan,wangwu
      }
  }
}

哈希值

哈希值是JDK根據對象的地址或者字符串或者數字算出來的int類型的數值

Object類中有一個方法可以獲取對象的哈希值

public int hashCode();//返回對象的哈希碼值
package org.example.set;

public class HashDemo {
   public static void main(String[] args) {
       //創建Student對象
       Student s1 = new Student("張三", 20);
       //同一個對象多次調用hashCode()方法返回的哈希值是相同的
       System.out.println(s1.hashCode());//356573597
       System.out.println(s1.hashCode());//356573597
       Student s2 = new Student("李四", 20);
       //默認情況下,不同對象的hashCode是不同的
       System.out.println(s2.hashCode());//1735600054
  }
}

HashSet集合

  1. HashSet集合特點

    1. 底層數據結構是哈希表

    2. 對集合的迭代順序不作任何保證,也就是說不保證存儲和取出的元素順序是一致的

    3. 沒有帶索引的方法,所以不能使用普通for循環遍歷

    4. 由於是Set集合,所以是不包含重復元素的集合

LinkedHashSet集合

LinkedHashSet集合特點

  1. 哈希表和鏈表實現的Set接口,具有可預測的迭代順序

  2. 由鏈表保證元素有序,也就是說元素的存儲和取出順序是一致的

  3. 由哈希表保證元素唯一,也就是說沒有重復的元素

package org.example.set;

import java.util.LinkedHashSet;

public class LinkedHashSetDemo {
   public static void main(String[] args) {
       //創建集合對象
       LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>();
       //添加對象
       linkedHashSet.add("zhangsan");
       linkedHashSet.add("lisi");
       linkedHashSet.add("wangwu");
       //添加重復數據
       linkedHashSet.add("lisi");
       //遍歷集合
       for (String item : linkedHashSet) {
           System.out.print(item+" ");//zhangsan lisi wangwu
      }

  }
}

TreeSet集合

TreeSet集合特點

  1. 元素有序,這里的順序不是值存儲和取出的順序,而是按照一定的規則進行排序,具體排序方式取決於構造方法

    1. TreeSet(): 根據其元素的自然排序進行排序

    2. TreeSet(Comparator comparator): 根據指定的比較器進行排序

  2. 沒有帶索引的方法,所以不能使用普通的for循環遍歷

  3. 由於是Set集合,所以不包含重復元素的集合

package org.example.set;

import java.util.TreeSet;

public class TreeSetDemo {
   public static void main(String[] args) {
       //創建集合對象
       TreeSet<Integer> treeSet = new TreeSet<>();
       //添加元素
       treeSet.add(20);
       treeSet.add(18);
       treeSet.add(28);
       treeSet.add(10);
       //添加重復元素
       treeSet.add(20);
       //遍歷集合-按照自然排序排序
       for (Integer integer : treeSet) {
           System.out.print(integer+" ");//10 18 20 28
      }

  }
}

自然排序Comparable的使用

  1. 存儲學生對象並遍歷,創建TreeSet集合無參構造方法

  2. 要求: 按照年齡從小到大排序,年齡相同時,按照姓名的字母順序排序

Student類

package org.example.set;

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

   public Student() {
  }

   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 s) {
       //按照年齡從小到大排序
       int num=this.age-s.age;
       num=num==0?this.name.compareTo(s.name):num;
       return num;
  }
}

ComparableDemo類

package org.example.set;

import java.util.TreeSet;

public class ComparableDemo {
   public static void main(String[] args) {
       //創建集合對象
       TreeSet<Student> treeSet = new TreeSet<>();
       //創建學生對象
       Student s1 = new Student("zhangsan", 29);
       Student s2 = new Student("lisi", 28);
       Student s3 = new Student("wangwu", 30);
       Student s4 = new Student("zhaoliu", 33);
       Student s5 = new Student("sunqi", 33);
       //把學生添加到集合中
       treeSet.add(s1);
       treeSet.add(s2);
       treeSet.add(s3);
       treeSet.add(s4);
       treeSet.add(s5);
       //遍歷集合
       for (Student student : treeSet) {
           System.out.println(student);
      }
  }
}

比較器排序Comparator的使用

  1. 存儲學生對象並遍歷,創建TreeSet集合使用帶參數構造方法

  2. 要求: 按照年齡從小到大排序,年齡相同時,按照姓名的字母順序排序

package org.example.set;

import java.util.Comparator;
import java.util.TreeSet;

public class ComparatorDemo {
   public static void main(String[] args) {
       //創建集合對象
       TreeSet<Student> treeSet = new TreeSet<>(new Comparator<Student>() {
           @Override
           public int compare(Student s1, Student s2) {
               int num = s1.getAge() - s2.getAge();
               num = num == 0 ? s1.getName().compareTo(s2.getName()) : num;
               return num;
          }
      });
       //創建學生對象
       Student s1 = new Student("zhangsan", 29);
       Student s2 = new Student("lisi", 28);
       Student s3 = new Student("wangwu", 30);
       Student s4 = new Student("zhaoliu", 33);
       Student s5 = new Student("sunqi", 33);
       //把學生添加到集合中
       treeSet.add(s1);
       treeSet.add(s2);
       treeSet.add(s3);
       treeSet.add(s4);
       treeSet.add(s5);
       //遍歷集合
       for (Student student : treeSet) {
           System.out.println(student);
      }
  }
}

 


免責聲明!

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



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