黑馬程序員---集合(三)---Set派系
Set下有以下小弟: 哈希表HashSet,二叉樹TreeSet
特點: 不允許存儲重複元素,沒有下標,無序集合,存儲的順序和取出的順序不一定一致
Set接口中的方法,和Collection中的方法一致的
//======================================================
2. HashSet集合
底層是哈希表結構(桶裝結構)
特點:線程不安全,允許存儲null,無序,不重複
哈希值:
每一個對象,都有自己的哈希值。哈細值的出現就是爲了提高哈希表的性能。哈希值是一個對象建立後,JVM根據哈希算法,計算出來的一個十進制數。這個十進制數就是哈希值。例如:
Person@123EA21 ,123EA21 哈希值,哈希值不是地址值
在Object類中,有一個方法hashCode()計算哈希值的,是本地方法
HashSet集合,存儲對象的時候, 依據是對象的哈希值碼。
如果對象的哈希值一致,再次比較equals
返回真,同一個對象,不存儲
返回假,後進來的對象,像籠屜一樣,掛靠在上一個對象的下面
哈希值,存儲的是哈希值,桶狀結構
當將對象存儲到HashSet集合的時候,集合首先會調用對象的hashCode方法,獲取哈希值
,如果兩個對象的哈希值一致,再次調用equals方法。
對於 兩個對象
如果哈希值相同 ,equals 一定返回真嗎 No
如果equals返回真,兩個對象一定具有相同的哈希值嗎 YES
自定義定的對象,被存儲到HashSet集合,必須重寫hashCode equals方法
//======================================================
3. TreeSet 集合
TreeSet集合,對存儲到的對象進行自然排序,底層結構二叉樹
TreeSet集合,需要對存儲的對象進行排序,TreeSet集合排序的依據是什麼?
依據的是對象的自然順序,凡是實現了Comparable接口的,都叫做自然順序
存儲的是String類對象,被TreeSet排序了,並且沒有異常
String類實現了Comparable接口
String類,比較自然順序的方法compareTo
s1.compareTo(s2)
如果s1 比 s2 小 小於0
如果s1 比 s2 大 大於0
如果s1 和s2一樣 返回0
存儲字符串的時候,TreeSet集合,會調用String類中的compareTo方法,實現排序
TreeSet(Comparator comparator)
構造一個新的空 TreeSet,它根據指定比較器進行排序。
TreeSet集合,構造方法中,傳遞一個參數,Comparator類型
Comparator是一個比較器,用來比較對象的
java.lang.Comparable 實現接口,類具備了自然順序
java.util.Comparator 比較器,比較器優先
定義類,實現Comparator接口
建立TreeSet對象的時候,在構造方法中,傳遞接口的實現類對象
TreeSet集合,就會安照自定義的比較器進行排序了
自定義定義比較器三步驟
定義類,實現java.util.Comparator接口
重寫compare方法
建立TreeSet集合,傳遞比較器對象
//======================================================
4. TreeSet集合案例
集合中存儲String對象,按照長度排序,如果長度一致,按照字典順序排序
String類,自己具備自然順序,實現長度排序,自己寫比較器
/*
* 字符串的長度排序
*/
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());
}
}
}
/*
* 自定義比較器,實現String的長度排序
*/
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集合,怎麼存儲怎麼取出
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());
}
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.