类图
- 小圆圈:表示接口。
- 与Map集合有关的有4个接口:Map接口、SortedMap接口、NevigatableMap接口和DIirectionary接口
- 粉色方框:表示抽象类AbstractMap
- 肉色方框:表示具体类。Map集合下包含4个类:TreeMap类、HashMap类、WeakHashMap类和HashTable类
类图的详细介绍
- Map接口:
- 用于保存具有映射关系的数据结构,实现该接口的类可以通过键来获取对应的值。
- 可以将给定一个键值对存储在Map接口的实现类实例中,如:
map.put("key", "value");
- 当访问的值不存在的时候,会抛出NoSuchElementException异常
- 当对象的类型和Map里元素类型不兼容时,会抛出ClassCastException异常
- 当在不允许使用NULL对象的Map中使用NULL对象,会抛出NullPointerException异常
- 当尝试修改一个只读的Map时,会抛出一个UnSupportedOperationException异常
- 如果把Map里的所有key放在以一起,就是一个Set集合
- AbstractMap类:该
- 类实现了Map接口中的很多通用的API,开发人员想要实现Map接口时,只需要继承该类然后重写对应的方法就可以实现自己需要的功能。而不需要将Map接口中的所有API都实现。
- SortedMap接口:
- 继承Map接口,它与Map的主要区别是:它拥有有序的键值对,实现有序的方式是通过实现Comparator接口
- NevigableMap接口:
- 该接口继承于SortedMap接口,因此该接口也是有序的键值对,但是它比SortedMap多增加一些导航的功能。
- TreeMap类:
- 实现了NavigableMap接口,因此它拥有一些导航功能。
- NavigableMap接口继承于SortedMap接口,因此它是一个有序键值对集合,并且是通过红黑树实现的。
- TreeMap类实现了Cloneable接口,意味着它
- TreeMap类实现了java.io.Serializable接口,意味着它支持序列化,它是有序的。
- HashMap类:
- 继承于AbstractMap,只保证是键值对
- WeakHashMap类:
- 只继承于AbstractMap类,它与HashMap不同的是,它的键的类型是弱引用。
- 弱引用:即使没有显示的添加或者删除任何元素也也可能发生下列情况:
- (1) 调用两次
size()
方法返回不同的值。 - (2) 两次调用
isEmpty()
方法,第一次返回false,第二次返回true - (3) 两次调用
containsKey()
方法,第一次返回true第二次,第二次返回,尽管两次使用的是同一个key. - (4) 两次调用
get()
方法的,第一次返回value,第二次返回null,尽管两次使用的是同一个对象
- HashTable类:
- 该类是一个过时的集合类,存在于Java API中很久了,在Java4中被重写了,实现了Map接口,自此以后也成为Java集合框架的一部分。
- 由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。
Map接口
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();//如果此映射不包含键-值映射关系,则返回 true。
boolean containsKey(Object key);//如果此映射包含指定键的映射关系,返回true
boolean containsValue(Object value);//如果此映射将一个或多个键映射到指定值,返回true
V get(Object key);//返回指定key所对应的value,如果此Map不包含该key,则返回null。
V put(K key, V value);
V remove(Object key);
void putAll(Map<? extends K, ? extends V> m);
void clear(); //删除该Map对象中所有key-value对
Set<K> keySet(); //返回该Map中所有key所组成的Set集合。
Collection<V> values();//保存value的Collection集合
Set<Map.Entry<K, V>> entrySet();//返回Map中所包含的key-value对所组成的Set集合,每个集合元素都是Map.Entry(Entry是Map的内部类)对象。
interface Entry<K,V> {
//Map内部的一个接口,Entry中封装着key和value
K getKey();//返回该Entry里包含的key值。
V getValue();//返回该Entry里包含的value值。
V setValue(V value);//设置该Entry里包含的value值,并返回新设置的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();//返回此映射的哈希码
}
Map的三种遍历方式
Map可以根据键、值和键值对进行遍历
Map map = new HashMap();
map.put("fujie"