探索Map接口

来源:互联网 发布:淘宝能注销账号吗 编辑:程序博客网 时间:2024/06/05 08:39

这里写图片描述

Map接口源码

package java.util;import java.util.function.BiConsumer;import java.util.function.BiFunction;import java.util.function.Function;import java.io.Serializable;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 putAll(Map<? extends K, ? extends V> m);    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();        public static <K extends Comparable<? super K>, V> Comparator<Map.Entry<K,V>> comparingByKey() {            return (Comparator<Map.Entry<K, V>> & Serializable)                    (c1, c2) -> c1.getKey().compareTo(c2.getKey());        }        public static <K, V extends Comparable<? super V>> Comparator<Map.Entry<K,V>> comparingByValue() {            return (Comparator<Map.Entry<K, V>> & Serializable)                    (c1, c2) -> c1.getValue().compareTo(c2.getValue());        }        public static <K, V> Comparator<Map.Entry<K, V>> comparingByKey(Comparator<? super K> cmp) {            Objects.requireNonNull(cmp);            return (Comparator<Map.Entry<K, V>> & Serializable)                    (c1, c2) -> cmp.compare(c1.getKey(), c2.getKey());        }        public static <K, V> Comparator<Map.Entry<K, V>> comparingByValue(Comparator<? super V> cmp) {            Objects.requireNonNull(cmp);            return (Comparator<Map.Entry<K, V>> & Serializable)                    (c1, c2) -> cmp.compare(c1.getValue(), c2.getValue());        }    }    boolean equals(Object o);    int hashCode();    //default方法都是1.8之后的新特性    default V getOrDefault(Object key, V defaultValue) {        V v;        return (((v = get(key)) != null) || containsKey(key))                ? v                        : defaultValue;    }    default void forEach(BiConsumer<? super K, ? super V> action) {        Objects.requireNonNull(action);        for (Map.Entry<K, V> entry : entrySet()) {            K k;            V v;            try {                k = entry.getKey();                v = entry.getValue();            } catch(IllegalStateException ise) {                // this usually means the entry is no longer in the map.                throw new ConcurrentModificationException(ise);            }            action.accept(k, v);        }    }    default void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {        Objects.requireNonNull(function);        for (Map.Entry<K, V> entry : entrySet()) {            K k;            V v;            try {                k = entry.getKey();                v = entry.getValue();            } catch(IllegalStateException ise) {                // this usually means the entry is no longer in the map.                throw new ConcurrentModificationException(ise);            }            // ise thrown from function is not a cme.            v = function.apply(k, v);            try {                entry.setValue(v);            } catch(IllegalStateException ise) {                // this usually means the entry is no longer in the map.                throw new ConcurrentModificationException(ise);            }        }    }    default V putIfAbsent(K key, V value) {        V v = get(key);        if (v == null) {            v = put(key, value);        }        return v;    }    default boolean remove(Object key, Object value) {        Object curValue = get(key);        if (!Objects.equals(curValue, value) ||                (curValue == null && !containsKey(key))) {            return false;        }        remove(key);        return true;    }    default boolean replace(K key, V oldValue, V newValue) {        Object curValue = get(key);        if (!Objects.equals(curValue, oldValue) ||                (curValue == null && !containsKey(key))) {            return false;        }        put(key, newValue);        return true;    }    default V replace(K key, V value) {        V curValue;        if (((curValue = get(key)) != null) || containsKey(key)) {            curValue = put(key, value);        }        return curValue;    }    default V computeIfAbsent(K key,            Function<? super K, ? extends V> mappingFunction) {        Objects.requireNonNull(mappingFunction);        V v;        if ((v = get(key)) == null) {            V newValue;            if ((newValue = mappingFunction.apply(key)) != null) {                put(key, newValue);                return newValue;            }        }        return v;    }    default V computeIfPresent(K key,            BiFunction<? super K, ? super V, ? extends V> remappingFunction) {        Objects.requireNonNull(remappingFunction);        V oldValue;        if ((oldValue = get(key)) != null) {            V newValue = remappingFunction.apply(key, oldValue);            if (newValue != null) {                put(key, newValue);                return newValue;            } else {                remove(key);                return null;            }        } else {            return null;        }    }    default V compute(K key,            BiFunction<? super K, ? super V, ? extends V> remappingFunction) {        Objects.requireNonNull(remappingFunction);        V oldValue = get(key);        V newValue = remappingFunction.apply(key, oldValue);        if (newValue == null) {            // delete mapping            if (oldValue != null || containsKey(key)) {                // something to remove                remove(key);                return null;            } else {                // nothing to do. Leave things as they were.                return null;            }        } else {            // add or replace old mapping            put(key, newValue);            return newValue;        }    }    default V merge(K key, V value,            BiFunction<? super V, ? super V, ? extends V> remappingFunction) {        Objects.requireNonNull(remappingFunction);        Objects.requireNonNull(value);        V oldValue = get(key);        V newValue = (oldValue == null) ? value :            remappingFunction.apply(oldValue, value);        if(newValue == null) {            remove(key);        } else {            put(key, newValue);        }        return newValue;    }}

AbstractMap的源码:

package java.util;import java.util.Map.Entry;public abstract class AbstractMap<K,V> implements Map<K,V> {    protected AbstractMap() {    }    //从这里我们可以得知:map 是用 Set<Entry<K,V>>  进行数据的存储的    public int size() {        return entrySet().size();    }    public boolean isEmpty() {        return size() == 0;    }    //这里的value分为两种情况处理,null和entry的value    public boolean containsValue(Object value) {        Iterator<Entry<K,V>> i = entrySet().iterator();        if (value==null) {            while (i.hasNext()) {                Entry<K,V> e = i.next();                if (e.getValue()==null)                    return true;            }        } else {            while (i.hasNext()) {                Entry<K,V> e = i.next();                if (value.equals(e.getValue()))                    return true;            }        }        return false;    }    public boolean containsKey(Object key) {        Iterator<Map.Entry<K,V>> i = entrySet().iterator();        if (key==null) {            while (i.hasNext()) {                Entry<K,V> e = i.next();                if (e.getKey()==null)                    return true;            }        } else {            while (i.hasNext()) {                Entry<K,V> e = i.next();                if (key.equals(e.getKey()))                    return true;            }        }        return false;    }    public V get(Object key) {        Iterator<Entry<K,V>> i = entrySet().iterator();        if (key==null) {            while (i.hasNext()) {                Entry<K,V> e = i.next();                if (e.getKey()==null)                    return e.getValue();            }        } else {            while (i.hasNext()) {                Entry<K,V> e = i.next();                if (key.equals(e.getKey()))                    return e.getValue();            }        }        return null;    }    public V put(K key, V value) {        throw new UnsupportedOperationException();    }    public V remove(Object key) {        Iterator<Entry<K,V>> i = entrySet().iterator();        Entry<K,V> correctEntry = null;        if (key==null) {            while (correctEntry==null && i.hasNext()) {                Entry<K,V> e = i.next();                if (e.getKey()==null)                    correctEntry = e;            }        } else {            while (correctEntry==null && i.hasNext()) {                Entry<K,V> e = i.next();                if (key.equals(e.getKey()))                    correctEntry = e;            }        }        V oldValue = null;        if (correctEntry !=null) {            oldValue = correctEntry.getValue();            i.remove();        }        return oldValue;    }    public void putAll(Map<? extends K, ? extends V> m) {        for (Map.Entry<? extends K, ? extends V> e : m.entrySet())            put(e.getKey(), e.getValue());    }    public void clear() {        entrySet().clear();    }    transient volatile Set<K>        keySet = null;    transient volatile Collection<V> values = null;    public Set<K> keySet() {        if (keySet == null) {            keySet = new AbstractSet<K>() {                public Iterator<K> iterator() {                    return new Iterator<K>() {                        private Iterator<Entry<K,V>> i = entrySet().iterator();                        public boolean hasNext() {                            return i.hasNext();                        }                        public K next() {                            return i.next().getKey();                        }                        public void remove() {                            i.remove();                        }                    };                }                public int size() {                    return AbstractMap.this.size();                }                public boolean isEmpty() {                    return AbstractMap.this.isEmpty();                }                public void clear() {                    AbstractMap.this.clear();                }                public boolean contains(Object k) {                    return AbstractMap.this.containsKey(k);                }            };        }        return keySet;    }    public Collection<V> values() {        if (values == null) {            values = new AbstractCollection<V>() {                public Iterator<V> iterator() {                    return new Iterator<V>() {                        private Iterator<Entry<K,V>> i = entrySet().iterator();                        public boolean hasNext() {                            return i.hasNext();                        }                        public V next() {                            return i.next().getValue();                        }                        public void remove() {                            i.remove();                        }                    };                }                public int size() {                    return AbstractMap.this.size();                }                public boolean isEmpty() {                    return AbstractMap.this.isEmpty();                }                public void clear() {                    AbstractMap.this.clear();                }                public boolean contains(Object v) {                    return AbstractMap.this.containsValue(v);                }            };        }        return values;    }    //用于存储的数据结构 ->  Set<Entry<K,V>>    public abstract Set<Entry<K,V>> entrySet();    /*equals 方法还是要好好看一下,    (1)、内存上 先比较是不是引用同一块内存,    (2)、类型上 然后比较是不是map类型的对象    (3)、数据长度上  如果是的话,再比较两者保存的数据的大小    (4)、数据内容上  传入的参数的map对象通过containsKey(key)是否为true 和  get(key)是否能获取相同的value值 来比较是否相等    */    public boolean equals(Object o) {        if (o == this)            return true;        if (!(o instanceof Map))            return false;        Map<?,?> m = (Map<?,?>) o;        if (m.size() != size())            return false;        try {            Iterator<Entry<K,V>> i = entrySet().iterator();            while (i.hasNext()) {                Entry<K,V> e = i.next();                K key = e.getKey();                V value = e.getValue();                if (value == null) {                    if (!(m.get(key)==null && m.containsKey(key)))                        return false;                } else {                    if (!value.equals(m.get(key)))                        return false;                }            }        } catch (ClassCastException unused) {            return false;        } catch (NullPointerException unused) {            return false;        }        return true;    }    public int hashCode() {        int h = 0;        Iterator<Entry<K,V>> i = entrySet().iterator();        while (i.hasNext())            h += i.next().hashCode();        return h;    }    public String toString() {        Iterator<Entry<K,V>> i = entrySet().iterator();        if (! i.hasNext())            return "{}";        StringBuilder sb = new StringBuilder();        sb.append('{');        for (;;) {            Entry<K,V> e = i.next();            K key = e.getKey();            V value = e.getValue();            sb.append(key   == this ? "(this Map)" : key);            sb.append('=');            sb.append(value == this ? "(this Map)" : value);            if (! i.hasNext())                return sb.append('}').toString();            sb.append(',').append(' ');        }    }    protected Object clone() throws CloneNotSupportedException {        AbstractMap<?,?> result = (AbstractMap<?,?>)super.clone();        result.keySet = null;        result.values = null;        return result;    }    /*这里的代码非常简洁,比较o1是否为null,是的话,比较o2是否为null,如果还是的话,返回true;    不是的话,返回false。如果o1不为null,则判断o1是否等于o2*/    private static boolean eq(Object o1, Object o2) {        return o1 == null ? o2 == null : o1.equals(o2);    }    //这里是抽象类中的静态内部类    public static class SimpleEntry<K,V>        implements Entry<K,V>, java.io.Serializable    {        private static final long serialVersionUID = -8499721149061103585L;        private final K key;        private V value;        public SimpleEntry(K key, V value) {            this.key   = key;            this.value = value;        }        public SimpleEntry(Entry<? extends K, ? extends V> entry) {            this.key   = entry.getKey();            this.value = entry.getValue();        }        public K getKey() {            return key;        }        public V getValue() {            return value;        }        public V setValue(V value) {            V oldValue = this.value;            this.value = value;            return oldValue;        }        public boolean equals(Object o) {            if (!(o instanceof Map.Entry))                return false;            Map.Entry<?,?> e = (Map.Entry<?,?>)o;            return eq(key, e.getKey()) && eq(value, e.getValue());        }        public int hashCode() {            return (key   == null ? 0 :   key.hashCode()) ^                   (value == null ? 0 : value.hashCode());        }        public String toString() {            return key + "=" + value;        }    }    public static class SimpleImmutableEntry<K,V>        implements Entry<K,V>, java.io.Serializable    {        private static final long serialVersionUID = 7138329143949025153L;        private final K key;        private final V value;        public SimpleImmutableEntry(K key, V value) {            this.key   = key;            this.value = value;        }        public SimpleImmutableEntry(Entry<? extends K, ? extends V> entry) {            this.key   = entry.getKey();            this.value = entry.getValue();        }        public K getKey() {            return key;        }        public V getValue() {            return value;        }        public V setValue(V value) {            throw new UnsupportedOperationException();        }        public boolean equals(Object o) {            if (!(o instanceof Map.Entry))                return false;            Map.Entry<?,?> e = (Map.Entry<?,?>)o;            return eq(key, e.getKey()) && eq(value, e.getValue());        }        public int hashCode() {            return (key   == null ? 0 :   key.hashCode()) ^                   (value == null ? 0 : value.hashCode());        }        public String toString() {            return key + "=" + value;        }    }}
原创粉丝点击