1. 程式人生 > >map containsKey與get方法區別

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.返回物件的記憶體地址經過處理後的結構,由於每個物件的記憶體地址都不一樣,所以雜湊碼也不一樣。
2:String類的hashCode.根據String類包含的字串的內容,根據一種特殊演算法返回雜湊碼,只要字串所在的堆空間相同,返回的雜湊碼也相同。 3:Integer類,返回的雜湊碼就是Integer物件裡所包含的那個整數的數值,例如Integer i1=new Integer(100),i1.hashCode的值就是100 。由此可見,2個一樣大小的Integer物件,返回的雜湊碼也一樣。


Map集合允許值物件為null,並且沒有個數限制,所以當get()方法的返回值為null時,可能有兩種情況,一種是在集合中沒有該鍵物件,另一種是該鍵物件沒有對映任何值物件,即值物件為null。因此,在Map集合中不應該利用get(Object key)

方法來判斷是否存在某個鍵,而應該利用containsKey()方法來判斷,containsKey方法用來判斷Map集合物件中是否包含指定的鍵名。



語法  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方法,以保證唯一性!