開發者學堂課程【Java面試疑難點串講1:面試技巧及語言基礎:Set集合】學習筆記,與課程緊密聯系,讓使用者快速學習知識。
課程位址: https://developer.aliyun.com/learning/course/24
Set集合
内容介紹
1. Set集合簡介
2. 範例:HashSet子類範例
3. 範例:HashSet實作重複元素的不儲存
4. 範例:使用TreeSet.
Set集合簡介
對于Set集合應該有一個基礎的認識:Set集合本身隻定義有不允許重複的存儲。Set接口完整的繼承了Collection接口,也就是說Set集合幾乎與Collection的操作是對等的。從實際的開發來看,大量使用到Set集合的架構隻有Hibernate;還有一些批量删除這樣的功能。因為大量的情況下優先考慮的還是List接口。
但是對于Set接口最麻煩的問題不在于它的接口特點而在于子類特點,如果從開發的角度來看,整個Set接口中有以下三個可能見到的子類:
• HashSet: 無序存放
– 打開源代碼發現在整個HashSet類裡面存在有一個 HashMap,但是很明顯,沒使用這個 Map 的Value,隻使用了Key的主要要特點: key不能夠重複);.
– 在HashSet類執行add(方法的時候發現是利用了Map接口中的put()實作的;
– 在整個存儲的過程之中存在有一個hashCode(的使用;
– 在内部的Node類處理時依然使用了equals)判斷key 與 value内容。
• TreeSet: 發現使用的是Map集合( SortedMap接口子類);
– 裡面存放的是TreeMap,TreeMap的特點在于所有的kev都是可以排序的,而排序的依據可以發現Comparable(往往會忽略掉Comparator)
– 在TreeMap之中對于大小的關系判斷強制使用了Comparable接口中的compareTo()完成。
• LinkeHashSet:如果這個時候需要進行連續的儲存(FIFO),這個時候就可以使用另一個子類。可以進行順序的儲存,是因為在進行存儲的時候采用的是連結清單形式完成的
範例:HashSet子類範例
import java.util.HashSet;import java.util.set; class Member {
private String name ;private int age ;
public Member(String name, int age) {
super();
this.name = name;this.age = age;
}
//無參構造、setter. getter都路@Override
public String toString() {
return "Member [name=" + name + ", age=" + age + "]\n";
public class TestDemo {
public static void main(String[]args) {
Set<Member> all = new HashSet<Member>() ;
all.add(new Member("張三",20)) ;
all.add(new Member("李四",20)) ;
all.add(new Member("王五",21)) ;
System.out.print1n(all);
}
這個時候之是以沒有能夠區分重複元素,是因為這個子類裡面并沒有提供一個與之相符合hashCode()和equals()方法。
範例:HashSet實作重複元素的不儲存
如果希望儲存的為增加順序,那麼可以更換子類
import java.uti1.Set;.class Member {
private String name ;uprivate int age ;-
public Member(String name,int age) {
this.name = name;uthis.age = age;
} }
範例:使用TreeSet.
import java.uti1.set;-import java.uti1.TreeSet;- class Member implements comparable<Member> {
private String name ;
private int age ;
this.name = name;
this.age = age;
正因為TreeSet的使用必須依靠Comaprable,并且在實際開發之中即便使用了集合儲存有所有的查詢結果,但是也很少會出現重複的判斷,因為資料表的主鍵不會重複。是以也就證明這個時候是否進行重複元素的判斷是沒有任何意義的。
是以在開發裡面最常用的一個子類:HashSet,隻需要判斷重複,而且大部分使用的情況是裡面儲存的都隻是像Itneger類,很少會去儲存一個對象。