天天看點

Set集合|學習筆記Set集合

開發者學堂課程【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類,很少會去儲存一個對象。