首页 > 编程笔记 > Java笔记 阅读:8

Java Map映射接口的用法(非常详细)

Collection 接口操作的时候每次都会向集合中增加一个元素,但是如果现在增加的元素是一个键值对,可以使用 Map 接口完成。

Map 接口是一个专门用来存储键/值对的对象。在 Map 接口中存储的关键字和值都必须是对象,并要求关键字唯一,而值可以重复。

Map 接口常用的实现类有 HashMap 类、LinkedHashMap 类、TreeMap 类和 Hashtable 类,前三个类的行为和性能与 Set 接口实现类 HashSet、LinkedHashSet 及 TreeSet 类似。

Hashtable 类是 Java 早期版本提供的类,经过修改实现了 Map 接口。


Map 接口及实现类的层次关系如下图所示:


图 1 Map接口及实现类的层次结构

Map<K,V> 接口定义在 java.util 包中,主要定义三类操作方法:修改、查询和集合视图。

1) 修改操作向映射中添加和删除键值对,具体方法如下:
2) 查询操作获得映射的内容,具体方法如下。
3) 集合视图允许将键、值或条目(键值对)作为集合处理,具体方法如下:
在 Map 接口中还包含一个 Map.Entry<K, V> 接口。它是一个使用 static 定义的内部接口,所以就是一个外部接口。其方法描述如下:

Java Map接口的实现类

Map 接口常用的实现类有 HashMap 类、TreeMap 类和 Hashtable 类。

1) HashMap类与LinkedHashMap类

HashMap 类的构造方法如下:
【实例】创建一个 HashMap 集合,向其中加入一些键值对,然后根据键获取值,并输出集合中所有键值对。
import java.util.HashMap;
import java.util.Map;

public class HashMapDemo {
    public static void main(String[] args) {
        Map<String, String> all = new HashMap<String, String>();
        all.put("BJ", "Beijing");
        all.put("NJ", "NanJing");
        String value = all.get("BJ"); // 根据 key 查询 value
        System.out.println(value);
        System.out.println(all.get("TJ"));
        System.out.println(all);
    }
}
程序执行结果为:

Beijing
null
{BJ=Beijing, NJ=NanJing}

在 Map 接口的操作中是根据 key 找到其对应的 value,如果找不到,则返回 null。而且现在由于使用的是 HashMap 子类,所以输出的键值对顺序和放入的顺序并不一定保持一致。

另外在 HashMap 中的 key 允许为 null。可以把 HashMapDemo.java 修改为如下代码:
import java.util.HashMap;
import java.util.Map;

public class HashMapDemo1 {
    public static void main(String[] args) {
       Map<String, String> all = new HashMap<String, String>();
       all.put("BJ", "BeiJing");
       all.put("NJ", "NanJing");
       all.put(null, "NULL");
       System.out.println(all.get(null));
    }
}
运行结果输出:

NULL

LinkedHashMap 类是 HashMap 类的子类,它保持键的顺序与插入的顺序一致。它的构造方法与 HashMap 的构造方法类似,在此不再赘述。

2) TreeMap类

HashMap 子类中的 key 都是无序存放。如果希望有序(按 key 排序),可以使用 TreeMap 类完成。但是需要注意的是,由于此类需要按照 key 进行排序,而且 key 本身也是对象,那么对象所在的类就必须实现 Comparable 接口。

TreeMap 类实现了 SortedMap 接口。SortedMap 接口能保证各项按关键字升序排序。TreeMap 类的构造方法如下:
对于程序 HashMapDemo.java 来说,如果希望键按照字母顺序输出,仅将 HashMap 类改为 TreeMap 类即可。

【实例】创建 TreeMap 类集合,向其中添加键值对,然后输出。
import java.util.Map;
import java.util.TreeMap;

public class TreeMapDemo {
    public static void main(String[] args) {
       Map<String, String> all = new TreeMap<String, String>();
       all.put("BJ", "BeiJing");
       all.put("NJ", "NanJing");
       String value = all.get("BJ"); // 根据 key 查询 value
       System.out.println(value);
       System.out.println(all.get("TJ"));
       System.out.println(all);
   }
}
程序执行结果为:

BeiJing
null
{BJ=BeiJing, NJ=NanJing}

键是按字母顺序输出的。

3) Hashtable类

Hashtable 类实现了一种哈希表,是 Java 早期版本提供的一个存放键值对的实现类,现在也属于集合框架。但哈希表对象是同步的,即是线程安全的。

任何非 null 对象都可以作为哈希表的关键字和值。但是要求作为关键字的对象必须实现 hashCode() 方法和 equals() 方法,以使对象的比较成为可能。

有两个参数影响一个 Hashtable 类实例的性能:初始容量(initial capacity)和装填因子(load factor)。

Hashtable 类的构造方法如下:
下面的代码创建了一个包含数字的哈希表对象,使用数字名作为关键字:
Hashtable numbers = new Hashtable();
numbers.put("one", new Integer(1));
numbers.put("two", new Integer(2));
numbers.put("three", new Integer(3));

要检索其中的数字,可以使用如下代码:
Integer n = (Integer) numbers.get("two");
if (n != null) {
    System.out.println("two = " + n);
}

Map 对象与 Hashtable 对象的区别如下:

相关文章