黑馬程序員---集合(三)---Set派系

                                                 關於Java中的集合--Set派系(三)
                 --------- android培訓java培訓、java學習型技術博客、期待與您交流! ------------

1. 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());
  }
 }
}


                  --------- android培訓java培訓、java學習型技術博客、期待與您交流! ------------
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章