5.Java基礎複習----Map

1.Map java.util.Map<K,V>  interface 實現Map接口的類用來存儲鍵-值 對;

  能夠存儲null鍵java

  Map類中存儲的鍵 -- 值 對經過鍵來標識,因此鍵值不能重複數組

  public     int size();集合大小安全

  public     boolean isEmpty();集合是否沒有鍵值對app

  public     boolean containsKey(Object key);是否包含鍵key性能

  public     boolean containsValue(Object value);是否包含值valuespa

  public     V        get(Object key) ;獲取鍵key對應的值value線程

  public     V        put(K key,V value);往Map中放入鍵值對,返回先前key對應的值code

  public     V        remove(Object key);移除鍵值對中鍵爲keyorm

  public     void    putAll(Map<? extends K,? extends V> m);放入一個Map m對象

  public     void    clear();清除全部鍵值對

  public     Set<K>  keySet();獲取Map中全部的鍵key

  public     Collection<V> values();獲取Map全部的值value

  public     Set<Map.Entry<K,V>> entrySet();返回Map中的鍵值對實體Map.Entry<K,V>

2.--HashMap    extends AbstractMap<K,V>  implements Map<K,V>, Cloneable, Serializable

  static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 ;默認初始化容量  必須是2的倍數

  static final float DEFAULT_LOAD_FACTOR = 0.75f;     默認初始化加載因子0.75

  Entry<K,V> 數組存儲 K-V 

3.HashMap的工做原理

     內部使用Entry<K,V> 數組存儲對象 默認數組大小爲16

  HashMap基於hashing原理,咱們經過put()和get()方法儲存和獲取對象。

       當咱們將鍵值對傳遞給put()方法時,它調用鍵對象的hashCode()方法來計算hashcode,讓後找到bucket位置來儲存值對象。

      

      

      

      HashMap使用鏈表來解決碰撞問題,當發生碰撞了,對象將會儲存在鏈表的第一個節點中。 HashMap在每一個鏈表節點中儲存鍵值對對象。

 當獲取對象時,經過鍵對象的equals()方法找到正確的鍵值對,而後返回值對象。


  當兩個不一樣的鍵對象的hashcode相同時會發生什麼? 它們會儲存在同一個bucket位置的鏈表中。鍵對象的equals()方法用來找到鍵值對。

  出於性能的考慮,咱們會常常用到HashMap和ConcurrentHashMap。

爲何String, Interger這樣的wrapper類適合做爲鍵? 

  •        String, Interger這樣的wrapper類做爲HashMap的鍵是再適合不過了,並且String最爲經常使用。由於String是不可變的,也是final的,並且已經重寫了equals()和hashCode()方法了。其餘的wrapper類也有這個特色。不可變性是必要的,由於爲了要計算hashCode(),就要防止鍵值改變,若是鍵值在放入時和獲取時返回不一樣的hashcode的話,那麼就不能從HashMap中找到你想要的對象。不可變性還有其餘的優勢如線程安全。若是你能夠僅僅經過將某個field聲明成final就能保證hashCode是不變的,那麼請這麼作吧。由於獲取對象的時候要用到equals()和hashCode()方法,那麼鍵對象正確的重寫這兩個方法是很是重要的。若是兩個不相等的對象返回不一樣的hashcode的話,那麼碰撞的概率就會小些,這樣就能提升HashMap的性能。

咱們可使用自定義的對象做爲鍵嗎?
  • 只要它遵照了equals()和hashCode()方法的定義規則,而且當對象插入到Map中以後將不會再改變了。若是這個自定義對象時不可變的,那麼它已經知足了做爲鍵的條件,由於當它建立以後就已經不能改變了。

咱們可使用CocurrentHashMap來代替HashTable嗎?
  • 咱們知道HashTable是synchronized的,可是ConcurrentHashMap同步性能更好,由於它僅僅根據同步級別對map的一部分進行上鎖。ConcurrentHashMap固然能夠代替HashTable,可是HashTable提供更強的線程安全性。

相關文章
相關標籤/搜索