Map简介
Map是一种以键值对方式存储数据的集合结构,将键映射到对象,键和对象之间有一个映射函数(散列函数),即 key -> f(x) -> value,一个key只能对应一个value,Map接口是这类集合结构的一个统一抽象,根据不同的应用场景分别有不同实现类。Map的实现类有很多,但常用的实现类有HashMap,Hashtable,LinkedHashMap,TreeMap等,HashMap基于数组+ 链表实现,JDK8以后加入了红黑树数据结构,提高了查询效率。Hashtable数据结构同样基于数组+单链表,不同的是Hashtable的方法都被synchronized修饰,线程安全,效率相对于hashmap低。LinkedHashMap继承了HashMap,并对HashMap进行了增强,提供了排序的功能,TreeMap基于排序二叉树实现。
Map接口的源码
public interface Map{
int size(); //返回Map的元素个数
boolean isEmpty(); //Map判空
boolean containsKey(Object key); //判断key存不存在
boolean containsValue(Object value); //判断值存不存在
V get(Object key); //获取Map元素
V put(K key, V value); //添加Map元素
V remove(Object key); //删除Map元素
void putAll(java.util.Map<? extends K, ? extends V> m); //将指定Map的key-value复制到该Map中
void clear(); //清空Map中的所有值
Set<K> keySet(); //获取Map的所有映射的key集合
Collection<V> values(); //获取Map的所有映射的value集合
Set<java.util.Map.Entry<K, V>> entrySet(); //获取Map的所有映射的key-value集合
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<java.util.Map.Entry<K,V>> comparingByKey() {
return (Comparator<java.util.Map.Entry<K, V>> & Serializable)
(c1, c2) -> c1.getKey().compareTo(c2.getKey());
}
public static <K, V extends Comparable<? super V>> Comparator<java.util.Map.Entry<K,V>> comparingByValue() {
return (Comparator<java.util.Map.Entry<K, V>> & Serializable)
(c1, c2) -> c1.getValue().compareTo(c2.getValue());
}
public static <K, V> Comparator<java.util.Map.Entry<K, V>> comparingByKey(Comparator<? super K> cmp) {
Objects.requireNonNull(cmp);
return (Comparator<java.util.Map.Entry<K, V>> & Serializable)
(c1, c2) -> cmp.compare(c1.getKey(), c2.getKey());
}
public static <K, V> Comparator<java.util.Map.Entry<K, V>> comparingByValue(Comparator<? super V> cmp) {
Objects.requireNonNull(cmp);
return (Comparator<java.util.Map.Entry<K, V>> & Serializable)
(c1, c2) -> cmp.compare(c1.getValue(), c2.getValue());
}
}
boolean equals(Object o); //将指定的map与该map进行比较,相同返回true
int hashCode(); //返回map的hash码值
//返回key对应的value,如果key不存在或者value为null,则返回指定的默认值
default V getOrDefault(Object key, V defaultValue) {
V v;
return (((v = get(key)) != null) || containsKey(key)) ? v : defaultValue;
}
/*
* 迭代map,JDK8以后的方式,实际上把for (java.util.Map.Entry<K, V> entry : entrySet())操作放入到map对象中,
* 让代码更加优雅,该方法中只支持读操作,任何修改map的操作都会导致抛出ConcurrentModificationException异常
*/
default void forEach(BiConsumer<? super K, ? super V> action) {
Objects.requireNonNull(action);
for (java.util.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);
}
}
/**
* 将该map的key-value用指定map的key-vlaue进行替换,JDK8以后版本提供
*/
default void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {
Objects.requireNonNull(function);
for (java.util.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);
}
}
}
//如果指定key对应的value为null,则用替换为指定值,JDK8提供
default V putIfAbsent(K key, V value) {
V v = get(key);
if (v == null) {
v = put(key, value);
}
return v;
}
//当map中元素的key-value与指定的key和value对应相等时删除该元素
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;
}
//替换指定key的值
default V replace(K key, V value) {
V curValue;
if (((curValue = get(key)) != null) || containsKey(key)) {
curValue = put(key, value);
}
return curValue;
}
// 如果指定的键尚未与值相关联(或映射到null ),则尝试使用给定的映射函数计算其值,并将其输入到此映射中,除非null
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;
}
/*
* 如果指定的key的值存在且非空,则尝试计算给定key及其当前映射值的新映射。
* 如果函数返回null ,则删除映射。 如果函数本身引发(未检查)异常,则异常被重新引导,并且当前映射保持不变
*/
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;
}
}
/*
* 尝试计算指定key及其当前映射的value(如果没有当前映射,则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;
}
}
/*
* 如果指定的key尚未与value相关联或与null相关联,则将其与给定的非空值相关联。
* 否则,将关联值替换为给定重映射函数的结果,如果结果为null.
*/
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;
}}