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

Java Map集合类的用法(附带实例)

java.util 包中提供了一些集合类,这些集合类又被称为容器。提到容器不难想到数组。集合类与数组的不同之处是:
常用的集合有 List 集合、Set 集合和 Map 集合,各个集合类的继承关系如下图所示:


图 1 常用集合类的继承关系

Map 接口没有继承 Collection 接口,其提供的是 key 到 value 的映射。通过 Map 接口的实现类实现 Map 接口,即可创建 Map 集合。

在 Map 集合中,不能包含相同的 key,每个 key 只能映射一个 value。key 还决定了存储对象在映射中的存储位置,但不是由 key 对象本身决定的,而是通过一种“散列技术”进行处理的,产生一个散列码的整数值。散列码通常被用作一个偏移量,该偏移量对应分配给映射的内存区域的起始位置,从而确定存储对象在映射中的存储位置。

Map 接口提供了将 key 映射到值的对象。一个映射不能包含重复的 key,每个 key 最多只能映射到一个值。除集合的常用方法外,Map 接口还提供了如下表所示的特殊方法。

表:Map 接口中除集合常用方法外的特殊方法
方法 功能描述
put(K key, V value) 向集合中添加指定的 key 与 value 的映射关系
containsKey(Object key) 如果此映射包含指定 key 的映射关系,则返回 true
containsValue(Object value) 如果此映射将一个或多个 key 映射到指定值上,则返回 true
get(Object key) 如果存在指定的 key 对象,则返回该对象对应的值,否则返回 null
keySet() 返回该集合中的所有 key 对象形成的 Set 集合
values() 返回该集合中所有值对象形成的 Collection 集合

Java HashMap类

建议使用 HashMap 类实现 Map 集合,因为由 HashMap 类实现的 Map 集合添加和删除映射关系效率更高。可以通过 HashMap 类创建 Map 集合,当需要顺序输出时,再创建一个完成相同映射关系的 TreeMap 类实例。

【实例】输出 Map 集合中教程网址和教程名称(值)。在项目中创建 HashMapTest 类,先在主方法中创建 Map 集合,再向 Map 集合中添加键值对。其中,key 的值分别为“/c/”、“/cplus/”、“/python/”、“/java/”,value 的值分别为“C语言入门教程”、“C++入门教程”、“Python基础教程”、“Java学习教程”。接着,分别获取 Map 集合中的 key 和 value,并把它们分别输出到控制台上。实例代码如下:
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class HashMapTest {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<>();    // 创建 Map 集合对象
        map.put("/c/", "C语言入门教程");
        map.put("/cplus/", "C++入门教程");
        map.put("/python/", "Python基础教程");
        map.put("/java/", "Java学习教程");    // 向 Map 集合中添加元素

        Set<String> set = map.keySet();    // 构建 Map 集合中所有 key 的 Set 集合
        Iterator<String> it = set.iterator();    // 创建 Iterator 迭代器
        System.out.println("key 值:");
        while (it.hasNext()) {
            System.out.print(it.next() + " ");    // 遍历并输出 Map 集合中的 key 值
        }

        Collection<String> coll = map.values();    // 构建 Map 集合中所有 value 值的集合
        it = coll.iterator();
        System.out.println("\nvalue 值:");
        while (it.hasNext()) {
            System.out.print(it.next() + " ");    // 遍历并输出 Map 集合中的 value 值
        }
    }
}
运行结果为:

key 值:
/cplus/ /java/ /c/ /python/
value 值:
C++入门教程 Java学习教程 C语言入门教程 Python基础教程

Java遍历Map集合

Map 集合的遍历与 List 集合和 Set 集合的遍历不同。因为 Map 集合有 key(键)和 value(值)两组值,所以遍历 Map 集合时既可以只遍历 key(键),也可以只遍历 value(值),还可以同时遍历 key(键)和 value(值)。

1) 同时遍历Map集合的key和value

在 for 循环中使用 entries 能够同时遍历 Map 集合的 key(键)和 value(值)。这种方式不仅是非常常见的,而且是非常常用的。

例如,通过 HashMap 类实现 Map 接口,创建一个 Map 集合。向 Map 集合中添加键值对,其中把星期的英文缩合作为 key(键),把星期的中文作为 value(值)。在 for 循环中使用 entries 能够同时遍历 Map 集合的 key(键)和 value(值),并把它们以键值对的形式输出到控制台上。代码如下:
import java.util.HashMap;
import java.util.Map;

public class Test {
    public static void main(String[] args) {
        // 创建 Map 集合对象
        Map<String, String> map = new HashMap<>();
        // 向 Map 集合中添加键值对
        map.put("Mon", "星期一");
        map.put("Tue", "星期二");
        map.put("Wed", "星期三");
        map.put("Thu", "星期四");
        map.put("Fri", "星期五");
        map.put("Sat", "星期六");
        map.put("Sun", "星期天");
        // 在 for 循环中使用 entries 遍历 Map 集合
        for (Map.Entry<String, String> entry : map.entrySet()) {
            String key = entry.getKey();    // 获取
            String value = entry.getValue();    // 获取
            System.out.println(key + ": " + value);
        }
    }
}
运行结果为:

Thu:星期四
Tue:星期二
Wed:星期三
Sat:星期六
Fri:星期五
Mon:星期一
Sun:星期天

2) 遍历Map集合的key或者value

使用 foreach 循环能够遍历 Map 集合的 key(键)或者 value(值)。

例如,通过 HashMap 类实现 Map 接口,创建一个 Map 集合。向 Map 集合中添加键值对,其中把星期的英文缩合作为 key(键),把星期的中文作为 value(值)。使用 foreach 循环分别遍历 Map 集合的 key(键)和 value(值),并把 key(键)和 value(值)分别输出到控制台上。代码如下:
import java.util.HashMap;
import java.util.Map;

public class Test {
    public static void main(String[] args) {
        // 创建 Map 集合对象
        Map<String, String> map = new HashMap<>();
        // 向 Map 集合中添加键值对
        map.put("Mon", "星期一");
        map.put("Tue", "星期二");
        map.put("Wed", "星期三");
        map.put("Thu", "星期四");
        map.put("Fri", "星期五");
        map.put("Sat", "星期六");
        map.put("Sun", "星期天");
        // 输出 key(键)
        for (String key : map.keySet()) {
            System.out.print(key + "\t");
        }
        System.out.println(); // 换行
        // 输出 value(值)
        for (String value : map.values()) {
            System.out.print(value + "\t");
        }
    }
}
运行结果如下:
Thu     Tue     Wed      Sat        Fri     Mon     Sun
星期四  星期二    星期三    星期六  星期五  星期一  星期天

Java TreeMap类

TreeMap 类不仅实现了 Map 接口,还实现了 java.util.SortedMap 接口,因此集合中的映射关系具有一定的顺序。但在添加、删除和定位映射关系时,TreeMap 类比 HashMap 类性能稍差。由于 TreeMap 类实现的 Map 集合中的映射关系是根据键对象按照一定的顺序排列的,因此不允许键对象是 null。

下面通过 TreeMap 类实现 Map 接口,代码如下:
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

public class TreeMapTest {
    public static void main(String[] args) {
        Map<String, String> map = new TreeMap<>();    // 创建 Map 集合对象
        map.put("/c/", "C语言入门教程");
        map.put("/cplus/", "C++入门教程");
        map.put("/python/", "Python基础教程");
        map.put("/java/", "Java学习教程");    // 向 Map 集合中添加元素

        Set<String> set = map.keySet();    // 构建 Map 集合中所有 key 的 Set 集合
        Iterator<String> it = set.iterator();    // 创建 Iterator 迭代器
        System.out.print("key 值:");
        while (it.hasNext()) {
            System.out.print(it.next() + " ");    // 遍历并输出 Map 集合中的 key 值
        }

        Collection<String> coll = map.values();    // 构建 Map 集合中所有 value 值的集合
        it = coll.iterator();
        System.out.print("\nvalue 值:");
        while (it.hasNext()) {
            System.out.print(it.next() + " ");    // 遍历并输出 Map 集合中的 value 值
        }
    }
}
运行结果为:

key 值:/c/ /cplus/ /java/ /python/
value 值:C语言入门教程 C++入门教程 Java学习教程 Python基础教程

相关文章