天天看点

集合源码分析之--Map接口

1 什么是Java Map接口

Map包含基于键的值,即包含键值对(key-value)。每个键和值对称为一个Entry。Map包含唯一的key。

如果我们的需求是必须基于Key来搜索,更新或删除元素,则“Map”很有用。

2 Java Map接口层次结构

有两个在Java中实现Map的接口:Map和SortedMap,以及三个类:HashMap,LinkedHashMap和TreeMap。Java Map的层次结构如下:

集合源码分析之--Map接口

Map不允许重复的key键,但是您允许有重复的value值。HashMap和LinkedHashMap允许空键和值,但是TreeMap不允许任何空键或值。

Map是不能直接遍历的,我们需要使用keySet() 或entrySet() 方法将其转换为Set再进行遍历。

Map接口方法理解

//返回map集合元素的个数(最大值不超过Integer.MAX_VALUE)
int size();
//是否为空
boolean isEmpty();
//是否包含某个元素(key)键
boolean containsKey(Object key)
//是否包含某个元素(value)键值
boolean containsValue(Object value)
//根据键,获取一个元素Value
V get(Object key)
//put一个键,值到集合MAP集合中
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()
boolean equals(Object o)
int hashCode()

//定义了一个内部接口
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());
        }
}