[JDK8]Map接口与Dictionary抽象类

package java.util;java

1、Map接口

接口定义

public interface Map<K,V>

Map是存放键值对的数据结构。map中没有重复的key,每一个key最多只能映射一个value。map不容许包含自身引用做为key。Map接口用来代替Dictionary抽象类。安全

Map接口提供了三种集合视图。map默认顺序是其集合视图迭代器遍历元素的顺序,例如HashMap。TreeMap自定义顺序。数据结构

抽象方法

2.1 查询操做并发

// 返回map中键值对个数。
// 若是map元素个数多于Integer.MAX_VALUE,返回Integer.MAX_VALUE。
int size();

// map中存在键值对,返回true
boolean isEmpty();

// map中存在指定key的映射,返回true。
boolean containsKey(Object key);

// map中存在一个或多个key映射到指定value,返回true。
// 性能可能为O(n),n为元素个数。
boolean containsValue(Object value);

// 获取指定key的映射值
// 一般值存在返回值,值不存在返回null
V get(Object key);

2.2 修改操做函数

// 向map中插入键值对,若已存在,则更新。
V put(K key, V value);

// 删除map中指定key的键值对。若不存在,返回null。
V remove(Object key);

2.3 对全部元素的操做性能

// 拷贝map中全部映射到当前map中
// 拷贝过程当中,参数map被修改,结果不肯定。
void putAll(Map<? extends K, ? extends V> m);

// 删除map中全部映射
void clear();

2.4 集合视图ui

// 返回map中key的集合视图
Set<K> keySet();

// 返回map中值的集合视图。
Collection<V> values();

// 返回map中entry的集合视图
Set<Map.Entry<K, V>> entrySet();

集合视图依赖于当前map。若是修改map中映射,就会在视图中有所体现。若是在对集合视图迭代的同时修改了map(迭代器自身的操做除外),迭代结果是不肯定的。三种集合视图均支持元素的删除,能够经过Iterator.remove、Collection/Set.remove、removeAll、retainAll 和 clear 操做从map中删除对应的键值对。均不支持添加add和addAll操做。线程

内部接口Entry
entry即键值对,Map.entrySet()返回的就是entry的集合,是获取entry引用的惟一途径。Map.Entry对象只在迭代过程当中有效。code

interface Entry<K,V> {
    // 返回entry的key
    K getKey();

    // 获取entry的value
    V getValue();

    // 设定新值
    V setValue(V value);

    // 比较当前entry与指定对象
    boolean equals(Object o);

    // 计算当前entry的hashcode
    int hashCode();

    // 比较器--使用天然排序的key比较Map.Entry
    // 1.8增长
    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());
    }

    // 比较器--使用天然排序的key比较Map.Entry
    // 1.8增长
    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());
    }

    // 比较器--使用给定key比较器比较Map.Entry
    // 1.8增长
    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());
    }

    // 比较器--使用给定value比较器比较Map.Entry
    // 1.8增长
    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());
    }
}

2.5 比较和hash对象

// 比较当前map与给定对象
boolean equals(Object o);

// 获取当前map的哈希值
// 值等于map中每一个entry哈希值的和。
int hashCode();

默认方法(1.8增长)

JDK8中增长几个默认方法,默认方法主要针对某些操做的实现,减小代码编写量。默认方法也结合了函数接口和lambda表达式进行实现。须要注意的是,默认方法实现是线程不安全的,并发场景使用须要重写。

相关文章
相关标签/搜索