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
都是字串型別