Set接口:無序集合,不允許有重復值,允許有null值
存入與取出的順序有可能不一致
HashSet:具有set集合的基本特性,不允許重復值,允許null值
底層實現是哈希表結構
初始容量為16
保存自定義對象時,保證數據的唯一性,主要由哈希表的結構決定
先判斷hashCode()是否相同,若相同,再判斷equals()是否相同
哈希表結構:哈希表中存放的都是對象的哈希碼值,當想要給哈希表中存放對象時,需要先進行對象的哈希碼值比較,若表中已經存在了相同的哈希碼,則繼續比較equals方法,比較對象的值是否相同,若返回false,則存入哈希表中,相當於兩個對象共享同一塊內存地址。若表中無相同的哈希碼值,則直接存入。
package com.itycl.array; /* * 用HashSet去除重復值 重寫toString() hashCode() equals() */ import java.util.HashSet; import java.util.Iterator;
public class HashSetDemo { public static void main(String[] args) {
HashSet<Integer> set=new HashSet<>(); set.add(1); set.add(2); set.add(3); set.add(3); set.add(4); set.add(4); Iterator it=set.iterator(); while(it.hasNext()) { Integer value = (Integer) it.next(); System.out.println(value); } System.out.println(set); } }
|
HashSet存放自定義對象:
package SetDemo1;
import java.util.HashSet; import java.util.Iterator; /*課堂練習: * * * * System.out.println():默認添加: 內容.toString * 輸出該對象的字符串表示 * * * */
public class HashSetDemo2 { public static void main(String[] args) { HashSet<Person> ps=new HashSet<>(); ps.add(new Person("小花","18")); ps.add(new Person("小綠","19")); ps.add(new Person("小紅","19")); ps.add(new Person("小粉","18"));
ps.add(new Person("小草","19")); ps.add(new Person("小草","19")); Iterator<Person> it=ps.iterator(); while(it.hasNext()) { System.out.println(it.next()); } } } |
Person類:
package collection;
public class Person implements Comparable<Person> { private String name; private int 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; } public Person(String name, int age) { super(); this.name = name; this.age = age; } @Override public int compareTo(Person o) { if(this.age>o.age) { return 1; }else if(this.age<o.age) { return -1; }else { return this.getName().compareTo(o.getName()); }
} @Override public String toString() {
return "Person[name="+name+","+"age="+age+"]"+"\t"; } @Override public int hashCode() { return this.name.hashCode()+this.age*7; } @Override public boolean equals(Object obj) {
if(obj==null) { throw new RuntimeException("傳入的對象不能為空!"); }
if(!(obj instanceof Person)) { throw new RuntimeException("傳入的對象不是Person的實例!"); }
Person p = (Person) obj; return p.getName().equals(this.name) && p.getAge()==(this.age);
} }
|
TreeSet:具有set集合的基本特性,有序集合,不允許重復值,允許null。
底層實現是樹的數據結構。
兩種排序方式:
a)實現自comparable接口:自然順序,實現該接口類自身就具備了一種可比較性
*重寫compareTo()方法
b)自定義一個比較器comparator:可以作為參數傳給set集合,讓集合具有明確的比較
1.實現自comparable接口:
package SetDemo1; import java.util.Iterator; import java.util.TreeSet; /*使用TreeSet集合保存自定義對象 * 並且,認為年齡和姓名相同對象為同一個學生對象 * */ public class TreeSetDemo1 { public static void main(String[] args) { TreeSet<Student> ts=new TreeSet<>(); ts.add(new Student("java01",20)); ts.add(new Student("java02",10)); ts.add(new Student("java03",20)); ts.add(new Student("java04",30)); ts.add(new Student("java05",20)); ts.add(new Student("java05",20));//不允許重復值 ts.add(null); Iterator<Student> it=ts.iterator(); while(it.hasNext()) { System.out.println(it.next()); } }
|
Person類:
package com.itycl.array; //實現comparable<T>接口 public class Person implements Comparable<Person> { private String name; private int 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; } public Person(String name, int age) { super(); this.name = name; this.age = age; } //重寫compareTo() @Override public int compareTo(Person o) { if(this.age>o.age) { return 1; }else if(this.age<o.age) { return -1; }else { return this.getName().compareTo(o.getName()); }
} //重寫toString() @Override public String toString() {
return "Person[name="+name+","+"age="+age+"]"+"\t"; } } |
2.自定義一個比較器:comparator,讓集合具有明確的比較
自定義比較器:實現implements Comparator接口
package com.itycl.array; import java.util.Comparator; public class MyComparator implements Comparator<Student> { @Override public int compare(Student o1, Student o2) { System.out.println(o1+":"+o2); if(o1==null || o2==null) { throw new RuntimeException("比較的參數不能為空"); } if(o1.getAge()>o2.getAge()) { return 1; }else if(o1.getAge()<o2.getAge()) { return -1; }else { return o1.getName().compareTo(o2.getName()); }
} } |
Student類:
package com.itycl.array; public class Student { private String name; private int age; public Student(String name, int age) { super(); 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 "Person[name="+name+","+"age="+age+"]"+"\t"; } } |
TreeSetDemo1:
package com.itycl.array; import java.util.Iterator; import java.util.TreeSet; public class TreeSetDemo1 { public static void main(String[] args) { MyComparator my=new MyComparator();//創建比較器對象,並且傳到set集合中,使set集合本身具有明確的比較 TreeSet<Student> set=new TreeSet<>(my); set.add(new Student("張倩",12)); set.add(new Student("李雷",10)); set.add(new Student("蘭蘭",6)); set.add(new Student("老劉",26)); set.add(new Student("王樂",21)); Iterator it=set.iterator(); while(it.hasNext()) { Student s = (Student) it.next(); System.out.println(s.toString()); } } } |