中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Map的key、value值的數據類型不能為基本類型的原因有哪些

發布時間:2020-11-02 16:31:31 來源:億速云 閱讀:243 作者:Leah 欄目:開發技術

這篇文章將為大家詳細講解有關Map的key、value值的數據類型不能為基本類型的原因有哪些,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

interface Map<K,V>

Map源碼

  /**
     * Returns the hash code value for this map entry. The hash code
     * of a map entry <tt>e</tt> is defined to be: <pre>
     *   (e.getKey()==null  &#63; 0 : e.getKey().hashCode()) ^
     *   (e.getValue()==null &#63; 0 : e.getValue().hashCode())
     * </pre>
     * This ensures that <tt>e1.equals(e2)</tt> implies that
     * <tt>e1.hashCode()==e2.hashCode()</tt> for any two Entries
     * <tt>e1</tt> and <tt>e2</tt>, as required by the general
     * contract of <tt>Object.hashCode</tt>.
     *
     * @return the hash code value for this map entry
     * @see Object#hashCode()
     * @see Object#equals(Object)
     * @see #equals(Object)
  */
    int hashCode();

hashCode返回 (e.getKey()==null &#63; 0 : e.getKey().hashCode()) ^(e.getValue()==null &#63; 0 : e.getValue().hashCode())

class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable

HashMap源碼中:

public final int hashCode() {
 return Objects.hashCode(key) ^ Objects.hashCode(value);
}
static final int hash(Object key) {
 int h;
 return (key == null) &#63; 0 : (h = key.hashCode()) ^ (h >>> 16);
}
public final boolean equals(Object o) {
 if (o == this)
    return true;
  if (o instanceof Map.Entry) {
    Map.Entry<&#63;,&#63;> e = (Map.Entry<&#63;,&#63;>)o;
  if (Objects.equals(key, e.getKey()) &&
    Objects.equals(value, e.getValue()))
    return true;
  }
  return false;
}

補充知識:java hashmap key long 和int 區別

最近同事問起,map里面存的key 是int 類型的,存了一個 Integera =123,為什么使用long 123 作為key get,取出來的是空,這個問題粗想了一下,感覺long和int 本身 類型不同,肯定不能是同一個key,后來細研究了一下,跟了一下源碼,發現邏輯不是那么簡單。

簡單測試了一下,如下代碼

Map<Object,String> map = new HashMap<>();
Integer b = 123;
Long c =123L;
map.put(b, b+"int");
System.out.println(b.hashCode() == c.hashCode()); //true
System.out.println(map.get(c));  //null
map.put(c, c+"long"); // size =2

簡單的總結了一下問題:

1、HashMap 是把key做hash 然后作為數組下標,但是 b 和c 的hashcode 竟然是相同的,為什么 get(c) 為空

2、HashMap 存入c 發現 size=2 ,hashcode相同 為什么 size=2,get(c) =123long

帶著上面兩個問題跟了一遍源碼,問題豁然開朗

1、hashmap在存入的時候,先對key 做一遍 hash,以hash值作為數組下標,如果發現 下標已有值,判斷 存的key 跟傳入的key是不是相同,使用 (k = p.key) == key || (key != null && key.equals(k)) ,如果相同覆蓋,而Interger的equals 方法如下:

if (obj instanceof Integer) {
      return value == ((Integer)obj).intValue();
    }

return false;

Integer 和 Long 肯定不是一個類型,返回 false,這時候 hashmap 以 hashkey 沖突來處理,存入鏈表,所以 Long 123 和 Integer 123 hashmap會認為是 hash沖突

2、hashmap 在 get的時候,也是先做 hash處理,根據hash值查找對應的數組下標,如果找到,使用存入時候的判斷條件

(k = first.key) == key || (key != null && key.equals(k)) 如果相等就返回,不相等,查找當前值的next有沒有值,有繼續根據邏輯判斷,所以 存入Integer 123 根據 Long 123 來獲取返回的 是 NULL

至此,解析完畢。

關于Map的key、value值的數據類型不能為基本類型的原因有哪些就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

原阳县| 乌兰察布市| 湛江市| 阿勒泰市| 祁阳县| 伊通| 昌都县| 万安县| 西丰县| 鹤岗市| 长春市| 敦煌市| 会宁县| 黎平县| 汤阴县| 台湾省| 垦利县| 安西县| 南和县| 通河县| 社旗县| 夹江县| 洱源县| 阿勒泰市| 攀枝花市| 白水县| 丹寨县| 红安县| 万山特区| 昭苏县| 介休市| 义乌市| 勃利县| 西城区| 吴堡县| 广东省| 兰西县| 前郭尔| 衡阳县| 泾川县| 诸暨市|