Map,Map.Entry源码分析

一、简单介绍。

1、Map是java中的接口,Map.Entry是Map的一个内部接口。

2、Map提供了一些常用方法,如keySet()、entrySet()等方法,keySet()方法返回值是Map中key值的集合;entrySet()的返回值也是返回一个Set集合,此集合的类型为Map.Entry。

3、Map.Entry是Map声明的一个内部接口,此接口为泛型,定义为Entry<K,V>。它表示Map中的一个实体(一个key-value对)。接口中有getKey(),getValue方法。

二、源码分析。

Map源码(包含Entry的定义):

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();

} 

由源码可知:

1、Entry为Map内部的一个泛型接口,Entry的泛型决定了Map可以存哪些类型的数据。

再来看HashMap源码中的一段代码:


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) {
        }
    }



由以上两段源码可以看出:

1、Entry其实是一个链表。

2、我们往HashMap中put值的时候,值其实是存在Entry里面的。key和value分别会赋值到Entry的key和value中。

3、Entry中还有一个字段叫 final int hash;存取这个Entry的hash值。这个hash值是最终找数据的关键。

由以上可知,Entry对象才是HashMap的核心,存取了数据以及数据的唯一编号hash。






你可能感兴趣的:(Map,Map.Entry源码分析)