Map,Map.Entry源碼分析

1、簡單介紹。

一、Map是java中的接口,Map.Entry是Map的一個內部接口。 java

二、Map提供了一些經常使用方法,如keySet()、entrySet()等方法,keySet()方法返回值是Map中key值的集合;entrySet()的返回值也是返回一個Set集合,此集合的類型爲Map.Entry。 源碼分析

三、Map.Entry是Map聲明的一個內部接口,此接口爲泛型,定義爲Entry<K,V>。它表示Map中的一個實體(一個key-value對)。接口中有getKey(),getValue方法。 spa

2、源碼分析。

Map源碼(包含Entry的定義): code

package java.util; public interface Map<K,V> { int size(); boolean isEmpty(); boolean containsKey(Object key); boolean containsValue(Object value); V get(Object key); V put(K key, V value); V remove(Object key); void clear(); Set<K> keySet(); Collection<V> values(); Set<Map.Entry<K, V>> entrySet(); interface Entry<K,V> { K getKey(); V getValue(); V setValue(V value); boolean equals(Object o); int hashCode(); }  boolean equals(Object o); int hashCode(); } 

由源碼可知: 對象

一、Entry爲Map內部的一個泛型接口,Entry的泛型決定了Map能夠存哪些類型的數據。 接口

再來看HashMap源碼中的一段代碼: rem


static class Entry<K,V> implements Map.Entry<K,V> {
        final K key;
        V value;
        Entry<K,V> next;
        final int hash;

        Entry(int h, K k, V v, Entry<K,V> n) {
            value = v;
            next = n;
            key = k;
            hash = h;
        }

        public final K getKey() {
            return key;
        }

        public final V getValue() {
            return value;
        }

        public final V setValue(V newValue) {
            V oldValue = value;
            value = newValue;
            return oldValue;
        }

        public final boolean equals(Object o) {
            if (!(o instanceof Map.Entry))
                return false;
            Map.Entry e = (Map.Entry)o;
            Object k1 = getKey();
            Object k2 = e.getKey();
            if (k1 == k2 || (k1 != null && k1.equals(k2))) {
                Object v1 = getValue();
                Object v2 = e.getValue();
                if (v1 == v2 || (v1 != null && v1.equals(v2)))
                    return true;
            }
            return false;
        }

        public final int hashCode() {
            return (key==null   ? 0 : key.hashCode()) ^
                   (value==null ? 0 : value.hashCode());
        }

        public final String toString() {
            return getKey() + "=" + getValue();
        }

        void recordAccess(HashMap<K,V> m) {
        }

        void recordRemoval(HashMap<K,V> m) {
        }
    }



由以上兩段源碼能夠看出:

一、Entry實際上是一個鏈表。 get

二、咱們往HashMap中put值的時候,值實際上是存在Entry裏面的。key和value分別會賦值到Entry的key和value中。 源碼

三、Entry中還有一個字段叫 final int hash;存取這個Entry的hash值。這個hash值是最終找數據的關鍵。 hash

由以上可知,Entry對象纔是HashMap的核心,存取了數據以及數據的惟一編號hash。

相關文章
相關標籤/搜索