能夠存儲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
內部使用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中以後將不會再改變了。若是這個自定義對象時不可變的,那麼它已經知足了做爲鍵的條件,由於當它建立以後就已經不能改變了。
咱們知道HashTable是synchronized的,可是ConcurrentHashMap同步性能更好,由於它僅僅根據同步級別對map的一部分進行上鎖。ConcurrentHashMap固然能夠代替HashTable,可是HashTable提供更強的線程安全性。