(一)Set接口的定義java
Set接口也是Collection接口的子接口,可是與Collection或List接口不一樣的是,Set接口中不能加入重複的元素。this
Set接口的定義: public interface Set<E> extends Collection<E>編碼
Set接口的主要方法與Collection是一致的 Set接口的實例沒法像List接口那樣進行雙向輸出。spa
Set接口的經常使用子類:code
散列存放:HashSet對象
有序存放:TreeSet排序
(二)介紹 Set接口的經常使用子類:接口
2.1 散列的存放:HashSethash
HashSet是Set接口的一個子類,主要的特色是:裏面不能存放重複元素,並且是採用散列的存儲方式,因此是沒有順序的。 io
驗證HashSet類
import java.util.HashSet; import java.util.Set; public class HashSetDemo01 { public static void main(String[] args) { Set<String> allSet = new HashSet<String>(); allSet.add("A") ; // 增長元素 allSet.add("B") ; // 增長元素 allSet.add("C") ; // 增長元素 allSet.add("C") ; // 重複元素,不能加入 allSet.add("C") ; // 重複元素,不能加入 allSet.add("D") ; // 增長元素 allSet.add("E") ; // 增長元素 System.out.println(allSet) ; // 輸出集合對象,調用toString() } }
2.2 有序的存放:TreeSet
若是想對輸入的數據進行有序排列,則要使用TreeSet子類。
TreeSet類的定義以下:
public class TreeSet<E> extends AbstractSet<E>implements SortedSet<E>, Cloneable, Serializable
import java.util.Set; import java.util.TreeSet; public class TreeSetDemo01 { public static void main(String[] args) { Set<String> allSet = new TreeSet<String>(); allSet.add("C") ; // 加入元素 allSet.add("C") ; // 重複元素,不能加入 allSet.add("C") ; // 重複元素,不能加入 allSet.add("D") ; // 加入元素 allSet.add("B") ; // 加入元素 allSet.add("A") ; // 加入元素 allSet.add("E") ; // 加入元素 System.out.println(allSet) ; // 輸出集合,調用toString() } }
2.2.1 關於TreeSet的排序說明 :
一個普通的類對象是不能向TreeSet集合中加入的,若是直接加入會出現如下的異常: java.lang.ClassCastException
若是要想使用TreeSet則對象所在的類必須實現Compable接口
import java.util.Set; import java.util.TreeSet; class Person implements Comparable<Person> { // 定義Person類,實現比較器 private String name; // 定義name屬性 private int age; // 定義age屬性 public Person(String name, int age) { // 經過構造方法爲屬性賦值 this.name = name; // 爲name屬性賦值 this.age = age; // 爲age屬性賦值 } public String toString() { // 覆寫toString()方法 return "姓名:" + this.name + ";年齡:" + this.age; } public int compareTo(Person per) { // 覆寫compareTo()方法,指定排序規則 if (this.age > per.age) { // 經過年齡排序 return 1; } else if (this.age < per.age) { return -1; }else{ return 0 ; } } }
2.2.2 關於重複元素的說明
Set接口中是不容許存放重複元素的 一個類的對象是否重複須要依靠Object類中的如下方法完成:
hashCode():指定哈希碼
equals():對象比較
import java.util.HashSet; import java.util.Set; class Person { // 定義Person類 private String name; // 定義name屬性 private int age; // 定義age屬性 public Person(String name, int age) { // 經過構造方法爲屬性賦值 this.name = name; // 爲name屬性賦值 this.age = age; // 爲age屬性賦值 } public boolean equals(Object obj) { // 覆寫equals()方法 if (this == obj) { // 地址相等 return true; // 是同一個對象 } if (!(obj instanceof Person)) { // 傳遞進來的不是本類的對象 return false; // 不是同一個對象 } Person p = (Person) obj; // 進行向下轉型 if (this.name.equals(p.name) && this.age == p.age) { return true ; // 屬性依次比較 }else{ // 所有屬性相等,是同一對象 return false ; // 屬性不相等,不是同一對象 } } public int hashCode(){ // 覆寫hashCode()方法 return this.name.hashCode() * this.age ; // 指定編碼公式 } public String toString() { // 覆寫toString()方法 return "姓名:" + this.name + ";年齡:" + this.age; } }
2.3 SortedSet接口
從TreeSet類的定義中能夠發現,TreeSet裏實現了SortedSet接口,此接口主要是用於排序操做的,即:實現此接口的子類都屬於排序的子類。SortedSet接口定義以下: public interface SortedSet<E> extends Set<E>
2.3.1 SortedSet接口中定義的方法
No. |
方法 |
類型 |
描述 |
1 |
public Comparator<? super E> comparator() |
普通 |
返回與排序有關聯的比較器 |
2 |
public E first() |
普通 |
返回集合中的第一個元素 |
3 |
public SortedSet<E> headSet(E toElement) |
普通 |
返回從開始到指定元素的集合 |
4 |
public E last() |
普通 |
返回最後一個元素 |
5 |
public SortedSet<E> subSet(E fromElement,E toElement) |
普通 |
返回指定對象間的元素 |
6 |
public SortedSet<E> tailSet(E fromElement) |
普通 |
從指定元素到最後 |
驗證SortedSet接口:
import java.util.SortedSet; import java.util.TreeSet; public class TreeSetDemo05 { public static void main(String[] args) { SortedSet<String> allSet = new TreeSet<String>(); // 爲SortedSet實例化 allSet.add("A"); // 增長元素 allSet.add("B"); // 增長元素 allSet.add("C"); // 增長元素 allSet.add("C"); // 重複元素,不能加入 allSet.add("C"); // 重複元素,不能加入 allSet.add("D"); // 增長元素 allSet.add("E"); // 增長元素 System.out.println("第一個元素:" + allSet.first()); System.out.println("最後一個元素:" + allSet.last()); System.out.println("headSet元素:" + allSet.headSet("C")); System.out.println("tailSet元素:" + allSet.tailSet("C")); System.out.println("subSet元素:" + allSet.subSet("B","D")); } }