Java集合之Map

来源:互联网 发布:java字符日期格式化 编辑:程序博客网 时间:2024/06/06 04:40

转载请注明出处

图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 29entries 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

1 0