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