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集合
-
HashSet集合特點
-
底層數據結構是哈希表
-
對集合的迭代順序不作任何保證,也就是說不保證存儲和取出的元素順序是一致的
-
沒有帶索引的方法,所以不能使用普通for循環遍歷
-
由於是Set集合,所以是不包含重復元素的集合
-
LinkedHashSet集合
LinkedHashSet集合特點
-
哈希表和鏈表實現的Set接口,具有可預測的迭代順序
-
由鏈表保證元素有序,也就是說元素的存儲和取出順序是一致的
-
由哈希表保證元素唯一,也就是說沒有重復的元素
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集合特點
-
元素有序,這里的順序不是值存儲和取出的順序,而是按照一定的規則進行排序,具體排序方式取決於構造方法
-
TreeSet(): 根據其元素的自然排序進行排序
-
TreeSet(Comparator comparator): 根據指定的比較器進行排序
-
-
沒有帶索引的方法,所以不能使用普通的for循環遍歷
-
由於是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的使用
-
存儲學生對象並遍歷,創建TreeSet集合無參構造方法
-
要求: 按照年齡從小到大排序,年齡相同時,按照姓名的字母順序排序
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;
}
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的使用
-
存儲學生對象並遍歷,創建TreeSet集合使用帶參數構造方法
-
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>() {