转载请注明出处
图Map是一种依照键值存储元素的容器。键值与下标类似。在List中,下标是整数;而在Map中,键值可以是任意类型的对象。图中不能有重复的键值,每个键值对应一个值。一个键值和它的对应值构成一个条目,真正在图中存储的是这个条目。图的类型:散列图(HashMap)、链式散列图(LinkedHashMap)、树形图(TreeMap)等。这些图的通用特性都定义在Map接口中。
对于定位一个值、插入一个映射以及删除一个映射而言,HashMap类是高效的。LinkedHashMap类用链表实现来扩展HashMap类,它支持图中条目的排序。HashMap类中的条目是没有顺序的,但是在LinkedHashMap中,元素可以按照它们插入图的顺序排序(称为插入顺序),也可以按它们被最后一次访问时的顺序,从早到晚排序(称为访问顺序)。无参构造方法是以插入顺序来创建LinkedHashMap对象的。要按访问顺序创建LinkedHashMap对象,应使用构造方法LinkedHashMap(initialCapacity, loadFactor, true)。TreeMap在遍历排好序的键值时是很高效的。键值可以使用Comparable接口或Comparator接口来排序。
SoredMap接口是Map的一个子接口,使用它课确保图中的条目是排好序的。除此之外,它还提供方法firstKey()和lastKey()来返回图中的第一个和最后一个键值,而方法headMap(toKey)和tailMap(fromKey)分别返回键值小于toKey的那部分图和键值大于或等于fromKey的那部分图。
NavigableMap接口扩展了SoredMap,以提供导航方法lowerKey(key)、floorKey(key)、ceilingKey(key)和higherKey(key)来分别返回小于、小于或等于、大于或等于、大于某个给定键值的键值,如果没有这样的键值,它们都会返回null。方法pollFirstEntry()和pollLastEntry()分别删除并返回树图中的第一个和最后一个条目。
Java2以前,一般使用java.util.HashTable来映射键值和元素。为了适应Java集合框架,Java对Hashtable进行了重新设计,但是为了向后兼容保留了所有方法。 Hashtable实现了Map接口,除了Hashtable具有同步功能之外,它与HashMap的用法是一样的。
下面给出一个例子创建了一个散列图、一个链式散列图和一个树形图,以建立员工和年龄直接的映射关系。
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TreeMap;
/**
* @author lxd
* 2015-06-14
*/
public class TestMap {
public static void main(String[] args) {
Map<String, Integer> hashMap = new HashMap<String, Integer>();
hashMap.put("ZhangSan", 30);
hashMap.put("LiSi", 29);
hashMap.put("WangWu", 32);
hashMap.put("HeLiu", 27);
System.out.println("entries in HashMap");
System.out.println(hashMap);
//从一个散列图来创建一个树形图
Map<String, Integer> treeMap = new TreeMap<String, Integer>(hashMap);
System.out.println("\nentries in ascending order of key:(升序)");
System.out.println(treeMap);
//按访问顺序排序是链式散列图
Map<String, Integer> linkedHashMap = new LinkedHashMap<String, Integer>(16, 0.75f, true);
linkedHashMap.put("ZhangSan", 30);
linkedHashMap.put("LiSi", 29);
linkedHashMap.put("WangWu", 32);
linkedHashMap.put("HeLiu", 27);
System.out.println("\nthe age for for " + "LiSi is " + linkedHashMap.get("LiSi").intValue());
System.out.println("\nentries in LinkedHashMap");
System.out.println(linkedHashMap);
}
}
结果:
entries in HashMap
{HeLiu=27, WangWu=32, ZhangSan=30, LiSi=29}
entries in ascending order of key:(升序)
{HeLiu=27, LiSi=29, WangWu=32, ZhangSan=30}
the age for for LiSi is 29
entries in LinkedHashMap
{ZhangSan=30, WangWu=32, HeLiu=27, LiSi=29}
如输出所示,HashMap中条目顺序是随机的,TreeMap中的条目是按键值的升序排列的,LinkedHashMap中的条目是按元素最后一次被访问的时间从早到晚排序的。如果更新图时不需要保持图中元素的顺序,就使用HashMap;如果需要保持图中元素的插入顺序或访问顺序,就使用LinkedHashMap;如果需要使图按照键值排序,就使用TreeMap。
WeakHashMap类的每一个key对象保存了实际对象的弱引用,当系统回收了该key所对应的实际对象之后,WeakHashMap会自动删除该key对应的key-value对。该类可以用来做缓存的时候使用和内存管理有关。具体可以参考Java弱引用与WeakHashMap