1. 程式人生 > >API-Set介面,Map介面

API-Set介面,Map介面

Set介面:
        特點1: 無序,儲存的元素與新增順序無關
        特點2: 不可重複(使用元素的equals方法來判定是否重複)
        特點3: 能儲存null元素,只能儲存一次。
Hash演算法機制
Set集合在新增或檢視元素時,當集合中的元素過多時,就是進行
      多次的比較,效率變低。
     在設計元素型別時,提供hash演算法,用於返回物件的一個雜湊值(int)值。
      在集合所佔的記憶體中開闢很多小的區域,每個區域用於儲存一定範圍的雜湊值的元素。
     當我們想新增元素或檢索元素,先獲取此元素的雜湊值,然後去
     對應區域中查詢遍歷(大大降低了比較次數)
   --如果在這個區域,雜湊值對應的位置上沒有元素,就講此元素儲存到這個位置。
   --如果有,然後檢視兩個物件的equals的返回值
         --如果為true,  不能新增  
         --如果為false, 可以新增,新增至
                      對應的連結串列結構中(儘可能的避免發生)
重寫HashCode方法:
       重寫規則:儘可能的讓所有的成員變數都參與運算,
                         儘可能的避免出現hash值碰撞
注意:
       重寫的必要性:
   (1)如果重寫了equals(), 有必要重寫hashCode方法
   (2)如果equals()返回true, hashCode返回值有必要相同
   (3)如果equals()返回false,hashCode返回值不一定相同,
            如果返回值不同,可以提高檢索的效率
    
   反過來說:
    (1)hashCode值相同,equals方法可能不同
    (2)hashCode值不同,equals方法一定不同      
  
Set介面派生的子類       
   HashSet:通過實現hash演算法的一種資料結構,
                        無序,不重複
   LinkedHashSet:通過實現hash演算法的一種資料結構,但是
                         通過連結串列來維持順序。順序與新增順序一致。
   TreeSet: 使用二叉樹的一種資料結構,順序與自然排序有關係。
                        支援定製排序
                                               
=================
Set集合的遍歷
       因為Set集合是無序的,無下標可言,因此不能使用經典for
       迴圈。我們可以使用迭代器原理。
       
       (1) 呼叫集合的iterator()獲取迭代器
       (2) 使用foreach迴圈
Set集合的元素:
         不能輕易修改參與hash值演算法的成員變數。
         否則容易引起記憶體溢位。
         原因:成員變數修改後,會出現新的hash值,但是儲存位置還在
                  原hash值的位置上。因此操作時,找不
                  到具體的儲存位置。  
                  
子類:
   HashSet:
           無序,不重複,底層使用hash演算法計算儲存位置。 
           增加刪除時效率高     
   LinkedHashSet:是HashSet的子類
           底層使用hash演算法計算儲存位置,同時使用連結串列來維護
           順序,順序與新增順序一致。      
           在檢視檢索時,效率比較高    
   TreeSet:是SortedSet子介面的實現類,使用二叉樹的資料結構維護
            元素的順序。
=========================================
Map介面:集合框架中的另一個父介面
    Map集合,用於儲存一一對應的元素資料,第一個物件可以作為
        索引,第二個物件作為值,我們稱之為key-value,鍵值對。
 
    儲存資料的特點:
     (1)以key-value形式進行儲存。
     (2)key與value都必須是引用型別
     (3)key可以為null。  
     (4)key與value是單向一對一對映。
     (5)key不能重複
儲存機制:
     Map是基於陣列和連結串列的資料結構進行儲存資料。
           作為key的物件採用了hash演算法計算儲存的陣列
     (雜湊陣列,雜湊桶)的位置.如果計算出來的位置,
           陣列中此位置沒有元素,就可以新增到
           雜湊桶內,如果有元素,key的equals方法
           返回值為false,就會儲存在雜湊桶元素對應的單向連結串列中。 
           如果key的equals方法返回true,就進行替換(覆蓋)。 
     PS:使用Map集合,做為key的資料型別應該重寫equals和
      HashCode方法   
常用方法:
      V  put(K k,V v):   
            作用:用於儲存一對key-value.  返回被替換的value值  
                  如果不是替換就返回null
      V  get(K k):
                   作用:通過key物件,獲取對應的value物件,如果集合中
                   沒有此key,返回null 
 Map集合的遍歷
      Set<K>  keySet();
            用於獲取Map中所有的key物件,返回一個Set集合
      Set<Entry<K,V>>  entrySet();
            將key-value封裝成內部類物件,返回Entry物件的Set集合                        
      Collection<V> values();
           將map集合中的所有value封裝到一個Collection集合中。
裝載因子和HashMap的優化
      裝載因子:DEFAULT_LOAD_FACTOR = 0.75f 
      預設容量:DEFAULT_INITIAL_CAPACITY  
           16,就是陣列的容量
      元素個數: size    
           
   當我們建立一個HashMap物件時,底層陣列的初始容量為16。當儲存的資料的
   個數 size/DEFAULT_INITIAL_CAPACITY等於DEFAULT_LOAD_FACTOR時,
   陣列開始擴容。此時最佳。
   
   如果小於0.75擴容,比較佔記憶體。
   如果大於0.75擴容,操作的元素比較多。

============================
Map介面的子類:
  
HashMap與HashTable的區別
   (1)HashTable是一個古老的類。不建議使用
   (2)HashTable是一個執行緒安全的類,HashMap執行緒不安全
   (3)HashTable的key不能是null,HashMap可以是null
LinkedHashMap:是HashMap子類,使用連結串列來維護key-value的
         順序,在迭代時順序與新增順序一致。
TreeMap:
        是SortedMap子介面的實現類,使用了二叉樹的資料結構維護
        填入集合的順序。
    (1)自然排序:
               往TreeMap裡新增的key物件,可以實現Comparable介面。重寫
       compareTo方法
    (2)定製排序:做為key物件的資料型別,可以不實現Comparable介面。
              需要建立一個比較器Comparator物件。實現compare方法
Properties:
     是HashTable的子型別,用於封裝屬性檔案的key-value資訊
     因為在檔案裡寫的都是字串,因此Properties的key與value
     都是字串型別