欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

简单介绍 Java Map

程序员文章站 2022-04-25 17:40:51
...

简单介绍 Java Map

第一次使用 Java 的 Map,遇到一些坑。所以总结一下。

Map 基本定义

Map 是一种数据容器,采用映射的方式实现键(Key)和值(Value)的关联。

数组也可以认为采用映射的方式,实现数据的键(整数)和值的关联。

比如:

    char hello[6] = { 'w', 'o', 'r', 'l', 'd', '\0' };

其中的键是 0, 1, 2, 3, 4, 5 ,分别对应的值是字符 'w', 'o', 'r', 'l', 'd', '\0'

Map 定义

Java 的 Map 定义如下:

    /*
     *  K 是键(Key)的数据类型
     *  V 是值(Value)的数据类型
     */
    Map<K, V> map = new HashMap<>();

    /*
     *  如果我想定义 ID(不超过 int 范围的整数)和名字的关系 Map,可以如下定义:
     */
    Map<Integer, String> mapId2Name = new HashMap<>();

    /*
     *  更复杂的,我有多个班级(Group)多个学生(User)的多次测量的身高数据(Feature)。
     *      需要用班级ID(Long类型)关联每个班的学生
     *      而每个学生ID(Long类型)关联多组身高数据(float类型)
     *  可以如下定义:
     */
     Map<Long, Map<Long, List<float[]>>> mMapGroupUserFeature = new HashMap<>();

定义上有几点特点(或者说限制):

  • 键(Key)的数据类型必须是类(Class),不能用基础数据类型(int、float、char等)定义。值(Value)的数据类型则没有限制。
  • 初始化各种类型的 Map,必须用 HashMap 来初始化。

Map 使用

增加

    V put(K key, V value);

    mapId2Name.put(1068, "ZONE");

注意:使用 put 接口需要自行判断 key 是否已经存在,如果存在执行 put 操作会覆盖数据。

删除

    V remove(Object key);

    mapId2Name.remove(1068);

清空

    void clear();

    mapId2Name.clear();

获取

    V get(Object key);
    boolean containsKey(Object key);
    boolean containsValue(Object value);

    // 错误的获取方式
    String name = mapId2Name.get(1068);

    // 正确的获取方式
    String name = null;
    if (mapId2Name.containsKey(1068)) {
        name = mapId2Name.get(1068);
    }

注意:get 接口没有做有效性检查,所以传递的 key 必须是 Map 内存在的。

如果 key 不存在就调用 get 会出错。

需要用 containsKey 判断 key 是否存在于容器中。(containsValue 则是判断 value 是否存在于容器中)

Map 遍历

Map 由于保存了 key 和 value 的映射。

所以遍历方式有 3 种:

  • 遍历所有键 key
  • 遍历所有值 value
  • 遍历所有键值对 entry

这里以遍历键值对 entry 为例。

Map.Entry 键值对操作

通过键值对 entry 获取键 key 和值 value。

    K getKey();
    V getValue();

    // 假设其中一个键值对为 entry
    Map.Entry<Long, String> entry = ...;

    // 获取键
    Long id = entry.getKey();

    // 获取值
    String name = entry.getValue();

获取键值对集合

    Set<Map.Entry<K, V>> entrySet();

    Set<Map.Entry<Long, String>> entrySet = mapId2Name.entrySet();

遍历 Map 的方式可以通过遍历 entrySet

    Iterator<Map.Entry<Long, String>> iterator = mapId2Name.entrySet().iterator();
    while (iterator.hasNext()) {
        Map.Entry<Long, String> entry = iterator.next();

        // 获取键
        entry.getKey();

        // 获取值
        entry.getValue();
    }

注意:

这里的 iterator.next() 除了返回当前迭代器指向的 entry 实体,还会自动移到下一个 entry 实体。

所以如果需要获取 key 和 value,必须先把当前提取出的 entry 保存起来。

其它 Map

Java 中还有其它不同功能的 Map。

待下回分解

简单介绍 Java Map