Map 概览:
1. Map是一个接口,Map中存储的内容是键值对(key-value)。
2. 为了方便,我们抽象出AbstractMap类来让其他类继承,该类实现了Map中的大部分API,其他Map的具体实现就可以通过直接继承AbatractMap类即可。查询API文档可以知道AbstractMap比Map接口多了两个方法(除了AbstractMap继承Object的方法)
clone()
返回此 AbstractMap 实例的浅表副本:不复制键和值本身。
toString()
返回此映射的字符串表示形式。
3. SortedMap也是一个接口,它继承与Map接口。SortedMap中的内容与Map中的区别在于,它是有序的键值对,里面排序的方法是通过比较器(Comparator)实现的。
4. NavigableMap也是一个接口,它继承与SortedMap接口,所以它肯定也是有序的,另外,NavigableMap还有一些导航的方法:lowerEntry
、floorEntry
、ceilingEntry
和 higherEntry
分别返回与小于、小于等于、大于等于、大于给定键的键关联的 Map.Entry
对象,如果不存在这样的键,则返回null
。类似地,方法lowerKey
、floorKey
、ceilingKey
和higherKey
只返回关联的键。所有这些方法是为查找条目而不是遍历条目而设计的。
5. 再往下就是具体实现类了,TreeMap继承与AbstractMap,同时实现了NavigableMap接口。因此,TreeMap中的内容是有序键值对。
6. HashMap仅仅是继承了AbstractMap,并没有实现NavigableMap接口。因此,HashMap的内容仅是键值对而已,不保证有序。
7. WeakHashMap也是仅仅继承了AbstractMap,它和HashMap的区别是键类型不同,WeakHashMap的键是弱键。
8. HashTable虽然不是继承与AbstractMap,但是它继承与Dictionary(Dictionary也是键值对的接口),而且也实现了Map接口。因此,HashTable的内容也是键值对,且不保证顺序。但是和HashMap相比,HashTable是线程安全的,而且它支持通过Enumeration去遍历。
map:
package java.util;由上面的源码可知:
public interface Map<K,V> {
boolean isEmpty();
boolean containsKey(Object key);
boolean containsValue(Object value);
V get(Object key);
V put(K key, V value);
V remove(Object key);
void putAll(Map<? extends K, ? extends V> m);
void clear();
Set<K> keySet(); //保存key的Set
Collection<V> values(); //保存value的Collection
Set<Map.Entry<K, V>> entrySet(); //保存Map.Entry的Set
interface Entry<K,V> { //Map内部的一个接口,Entry中封装了key和value信息
K getKey();
V getValue();
V setValue(V value);
boolean equals(Object o);
int hashCode();
}
boolean equals(Object o);
int hashCode();
}
1. Map提供了一些接口分别用于返回键集、值集以及键值映射关系集。
keySet()用于返回键的Set集合;
values()用于返回值的Set集合;
entrySet()用于返回键值集的Set集合,键值信息封装在Entry中。
2. Map还对外提供了“获取键”、“根据键获取值”、“是否包含某个键或值”等等方法。
3. Map.Entry是Map内部的一个接口,Map.Entry是一个键值对,我们要想获取Map中的Map中的键值对,可以通过Map.entrySet()来获取,获取到的是一个装着Map.Entry的集合,然后可以通过这个Entry来实现对键值的操作。