简单介绍 Java Map

简单介绍 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 关系

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值