Java集合之Map

转载请注明出处

图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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值