黑馬程序員---集合(三)---Set派系
關(guān)于Java中的集合--Set派系(三)? ? ? ? ? ? ? ? ??
1. Set集合 的特點(diǎn)
Set下有以下小弟: 哈希表HashSet,二叉樹TreeSet
?特點(diǎn):?不允許存儲(chǔ)重復(fù)元素,沒有下標(biāo),無(wú)序集合,存儲(chǔ)的順序和取出的順序不一定一致
? ? ? ? ? ? ?Set接口中的方法,和Collection中的方法一致的
//======================================================
2. HashSet集合
? 底層是哈希表結(jié)構(gòu)(桶裝結(jié)構(gòu))
? 特點(diǎn):線程不安全,允許存儲(chǔ)null,無(wú)序,不重復(fù)
? 哈希值:
每一個(gè)對(duì)象,都有自己的哈希值。哈細(xì)值的出現(xiàn)就是為了提高哈希表的性能。哈希值是一個(gè)對(duì)象建立后,JVM根據(jù)哈希算法,計(jì)算出來(lái)的一個(gè)十進(jìn)制數(shù)。這個(gè)十進(jìn)制數(shù)就是哈希值。例如:
? ? Person@123EA21 ? ?,123EA21 哈希值,哈希值不是地址值
? ? 在Object類中,有一個(gè)方法hashCode()計(jì)算哈希值的,是本地方法
? ??
? ? HashSet集合,存儲(chǔ)對(duì)象的時(shí)候, 依據(jù)是對(duì)象的哈希值碼。
? ? 如果對(duì)象的哈希值一致,再次比較equals
? ? 返回真,同一個(gè)對(duì)象,不存儲(chǔ)
? ? 返回假,后進(jìn)來(lái)的對(duì)象,像籠屜一樣,掛靠在上一個(gè)對(duì)象的下面
? ? 哈希值,存儲(chǔ)的是哈希值,桶狀結(jié)構(gòu)
? ?當(dāng)將對(duì)象存儲(chǔ)到HashSet集合的時(shí)候,集合首先會(huì)調(diào)用對(duì)象的hashCode方法,獲取哈希值
? ?,如果兩個(gè)對(duì)象的哈希值一致,再次調(diào)用equals方法。
? ?對(duì)于 兩個(gè)對(duì)象
? ?如果哈希值相同 ,equals 一定返回真嗎 No
? ?如果equals返回真,兩個(gè)對(duì)象一定具有相同的哈希值嗎 YES
? ?自定義定的對(duì)象,被存儲(chǔ)到HashSet集合,必須重寫hashCode equals方法
? //======================================================
3. TreeSet 集合
? ?TreeSet集合,對(duì)存儲(chǔ)到的對(duì)象進(jìn)行自然排序,底層結(jié)構(gòu)二叉樹
?
? ?TreeSet集合,需要對(duì)存儲(chǔ)的對(duì)象進(jìn)行排序,TreeSet集合排序的依據(jù)是什么?
? ?依據(jù)的是對(duì)象的自然順序,凡是實(shí)現(xiàn)了Comparable接口的,都叫做自然順序
?
? ?存儲(chǔ)的是String類對(duì)象,被TreeSet排序了,并且沒有異常
? ?String類實(shí)現(xiàn)了Comparable接口
? ?String類,比較自然順序的方法compareTo
? ? ?s1.compareTo(s2)
? ? ?如果s1 比 s2 小 小于0
? ? ?如果s1 比 s2 大 大于0
? ? ?如果s1 和s2一樣 返回0
? 存儲(chǔ)字符串的時(shí)候,TreeSet集合,會(huì)調(diào)用String類中的compareTo方法,實(shí)現(xiàn)排序
?
? TreeSet(Comparator comparator)
? 構(gòu)造一個(gè)新的空 TreeSet,它根據(jù)指定比較器進(jìn)行排序。
? TreeSet集合,構(gòu)造方法中,傳遞一個(gè)參數(shù),Comparator類型
? Comparator是一個(gè)比較器,用來(lái)比較對(duì)象的
?
? java.lang.Comparable 實(shí)現(xiàn)接口,類具備了自然順序
? java.util.Comparator 比較器,比較器優(yōu)先
?
? 定義類,實(shí)現(xiàn)Comparator接口
? 建立TreeSet對(duì)象的時(shí)候,在構(gòu)造方法中,傳遞接口的實(shí)現(xiàn)類對(duì)象
? TreeSet集合,就會(huì)安照自定義的比較器進(jìn)行排序了
?
? 自定義定義比較器三步驟
? ? 定義類,實(shí)現(xiàn)java.util.Comparator接口
? ? 重寫compare方法
? ? 建立TreeSet集合,傳遞比較器對(duì)象
//======================================================
4. TreeSet集合案例
? ?集合中存儲(chǔ)String對(duì)象,按照長(zhǎng)度排序,如果長(zhǎng)度一致,按照字典順序排序
? ?String類,自己具備自然順序,實(shí)現(xiàn)長(zhǎng)度排序,自己寫比較器
/*
?* 字符串的長(zhǎng)度排序
?*/
import java.util.*;
public class TreeSetTest {
?public static void main(String[] args) {
? TreeSet ts = new TreeSet(new StringLengthSort());
? ts.add("ewasgwr");
? ts.add("tfsc");
? ts.add("32qew");
? ts.add("gfds");
? ts.add("jthrdshrgdfs");
? ts.add("qwe");
?
? Iterator it = ts.iterator();
? while(it.hasNext()){
? ?System.out.println(it.next());
? }
?}
}
/*
?* 自定義比較器,實(shí)現(xiàn)String的長(zhǎng)度排序
?*/
class StringLengthSort implements Comparator{
?public int compare(Object o1,Object o2){
? String s1 = (String)o1;
? String s2 = (String)o2;
? int num = s1.length() - s2.length();
? return num == 0 ? s1.compareTo(s2) : num;
?}
}
?
//======================================================
5. LinkedHashSet
? ? 有序的Set集合,怎么存儲(chǔ)怎么取出
import java.util.*;
public class LinkedHashSetDemo {
?public static void main(String[] args) {
? LinkedHashSet lhs = new LinkedHashSet();
? lhs.add("fef");
? lhs.add("etfs");
? lhs.add("wqerds");
? lhs.add("gvd");
? lhs.add("sfdx");
? System.out.println(lhs);
?
? Iterator it = lhs.iterator();
? while(it.hasNext()){
? ?System.out.println(it.next());
? }
?}
}
? ? ? ? ? ? ? ? ??