map containsKey與get方法區別
hashCode是jdk根據物件的地址或者字串或者數字算出來的int型別的數值
在Java中,雜湊碼代表物件的特徵。 例如物件 String str1 = “aa”, str1.hashCode= 3104 String str2 = “bb”, str2.hashCode= 3106 String str3 = “aa”, str3.hashCode= 3104 根據HashCode由此可得出str1!=str2,str1==str3 下面給出幾個常用的雜湊碼的演算法。 1:Object類的hashCode.返回物件的記憶體地址經過處理後的結構,由於每個物件的記憶體地址都不一樣,所以雜湊碼也不一樣。Map集合允許值物件為null,並且沒有個數限制,所以當get()方法的返回值為null時,可能有兩種情況,一種是在集合中沒有該鍵物件,另一種是該鍵物件沒有對映任何值物件,即值物件為null。因此,在Map集合中不應該利用get(Object key)
語法 boolean containsKey(Object key)
返回值:如果Map集合中包含指定的鍵名,則返回true;否則返回false。
引數:key是要查詢的Map集合的鍵名物件。
get方法
同樣當key為null時會進行特殊處理,在table[0]的連結串列上查詢key為null的元素
get的過程是先計算hash然後通過hash與table.length取摸計算index值,然後遍歷table[index]上的連結串列,直到找到key,然後返回
public V get(Object key) { if (key == null) return getForNullKey();//處理null值 int hash = hash(key.hashCode());//計算hash //在table[index]遍歷查詢key,若找到則返回value,找不到返回null for (Entry<K,V> e = table[indexFor(hash, table.length)]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || key.equals(k))) return e.value; } return null; }
containsKey和containsValue
containsKey方法是先計算hash然後使用hash和table.length取摸得到index值,遍歷table[index]元素查詢是否包含key相同的值
public boolean containsKey(Object key) { return getEntry(key) != null; } final Entry<K,V> getEntry(Object key) { int hash = (key == null) ? 0 : hash(key.hashCode()); for (Entry<K,V> e = table[indexFor(hash, table.length)]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) return e; } return null; }
containsValue方法就比較粗暴了,就是直接遍歷所有元素直到找到value,由此可見HashMap的containsValue方法本質上和普通陣列和list的contains方法沒什麼區別,你別指望它會像containsKey那麼高效
public boolean containsValue(Object value) { if (value == null) return containsNullValue(); Entry[] tab = table; for (int i = 0; i < tab.length ; i++) for (Entry e = tab[i] ; e != null ; e = e.next) if (value.equals(e.value)) return true; return false; }
containsKey使用例子:
1. 呼叫 Map 的 get() 方法獲取資料;
2. 如果返回不為 null, 直接返回該資料;
3. 如果返回為 null, 則生成資料, 或者從其他地方獲取資料, 然後存放入 Map 中, 最後返回該資料.
這裡, 我們可以通過使用 Map 的containsKey() 方法來檢測資料(value)是否存在, 如果key存在, 則表明已經獲取過一次資料, 那麼直接返回該 key 在 Map 中的值. 不管是否為 null 都直接返回; 如果 key 不存在, 則去生成或者獲取資料, 並放入到 Map 中, 並返回該資料.
這裡使用 containsKey() 來檢測可以應用於:
1. 從其他地方獲取的資料可能為空, 並且不會有變化;
2. 獲取資料比較耗時. 這個場景下, 使用該方法可以大大降低消耗, 特別是在同步情況下。
package com.demo.controller;
import java.util.HashMap;
import java.util.Map;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
Map map=new HashMap();
map.put("a","aaa");
System.out.println(map.containsKey("a")); //輸出true 既如果這個map集
閤中有這個key就返回true
System.out.println(map.containsKey("b")); //輸出false 既沒有就返回
false
}
}
總結:
get(Object key) 返回與指定鍵關聯的值;
containsKey(Object key) 如果Map包含指定鍵的隱射,則返回true;
重寫equals方法時需要重寫hashCode方法,主要是針對Map、Set等集合型別的使用;
a: Map、Set等集合型別存放的物件必須是唯一的;
b: 集合類判斷兩個物件是否相等,是先判斷equals是否相等,如果equals返回TRUE,還要再判斷HashCode返回值是否ture,只有兩者都返回ture,才認為該兩個物件是相等的。
2、由於Object的hashCode返回的是物件的hash值,所以即使equals返回true,集合也可能判定兩個物件不等,所以必須重寫hashCode方法,以保證當equals返回TRUE時,hashCode也返回Ture,這樣才能使得集合中存放的物件唯一。
HashMap物件是根據其Key的hashCode來獲取對應的Value。 在重寫父類的equals方法時,也重寫hashcode方法,使相等的兩個物件獲取的HashCode也相等,這樣當此物件做Map類中的Key時,兩個equals為true的物件其獲取的value都是同一個,一般對於存放到Set集合或者Map中鍵值對的元素,需要按需要重寫hashCode與equals方法,以保證唯一性!