Map集合的修改问题

作者: 新手村的0级玩家 | 来源:发表于2017-11-30 23:19 被阅读14次

0.前言

今天在对Map集合进行修改的过程中发现了一个比较有意思的点,特此整理记录如下:

1.需求

用Map集合存储Book 和对应的 数量 即 Map<Book, Integer>
在已知Book.ID的情况下,对指定Book的数量增加100(Map中一定存在该book)

      Map<Book, Integer> map = new HashMap<Book, Integer>();
        for (int i = 0; i < 5; i++) {
            Book book = new Book();
            book.setId("" + i);
            book.setName("魔戒" + i);
            book.setDescription("神奇的书籍");
            map.put(book, i);
        }
        for ( Entry<Book, Integer> entry : map.entrySet()) {
            System.out.println(entry.getKey()+"  ===== "+entry.getValue());
        }
原始Map

2.解决方案一

2.1下意识的思路:

获取现有数量+100,存回(修改)Map集合

        String id="3";
        Book b=new Book();
        b.setId(id);
        int num=map.get(b)+100;
        map.put(b, num);
        for ( Entry<Book, Integer> entry : map.entrySet()) {
            System.out.println(entry.getKey()+"  ===== "+entry.getValue());
        }
        }

2.2结果:

修改后的Map

2.3问题:

很明显的,对于Map集合而言
Book [id=3, name=null, description=null]

Book [id=3, name=魔戒3, description=神奇的书籍]
不是同一个key

3.解决方案

3.1解决方法

让Book重写hashCodeequals方法,让两个Book 只要id相等,即“相等”


    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Book other = (Book) obj;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        return true;
    }
        String id="3";
        Book b=new Book();
        b.setId(id);
        int num=map.get(b)+100;
        map.put(b, num);
        for ( Entry<Book, Integer> entry : map.entrySet()) {
            System.out.println(entry.getKey()+"  ===== "+entry.getValue());
        }
        }

3.2存在的疑惑:

此时的对象b是
Book [id=3, name=null, description=null]
map.put(b, num);
会不会导致Map中的key存储的数据不全?????
变成Book [id=3, name=null, description=null]

3.3代码验证

运行结果

3.4 反思

Book重写了hashCodeequals方法,让两个Book 只要id相等,即“相等”
那么对于Map集合而言
Book [id=3, name=null, description=null]
Book [id=3, name=魔戒3, description=神奇的书籍]
是相同的key
map.put(key, value);
当key在map中存在(新key和旧key“相等”)时,只修改value,不修改key

因此Map中作为key的Book在这种情况下不会改变

相关文章

  • Map集合的修改问题

    0.前言 今天在对Map集合进行修改的过程中发现了一个比较有意思的点,特此整理记录如下: 1.需求 用Map集合存...

  • List和Map集合详解

    一、List集合中添加Map集合 双重for循环引发的问题,map集合中后面的内容会覆盖前面的内容,原因是map是...

  • 2019-01-03

    Map集合 Map集合 1.1Map集合概念 Map集合是一种存放关系对象的对象的双列集合。 1.2Map集合的常...

  • 2019-01-13

    基于Map集合重点整理 Map集合 1.1Map集合概念 Map集合是一种存放关系对象的对象的双列集合。 1.2M...

  • 2020-06-30【Map】

    Map概述 Map集合的基本功能 Map集合的获取功能 Map集合的遍历 练习 Collections类 斗地主

  • Map集合Map<Integer,String> m

    01Map集合概述 A:Map集合概述:我们通过查看Map接口描述,发现Map接口下的集合与Collection接...

  • Map接口

    01Map集合概述 A:Map集合概述:我们通过查看Map接口描述,发现Map接口下的集合与Collection接...

  • 集合详解

    Iterator:迭代器,它是Java集合的顶层接口(不包括 map 系列的集合,Map接口 是 map 系列集合...

  • Java - Part 6

    一、Map集合Map集合和Collection集合不一样,Map集合是双列集合,以键值对的形式存在,键不能重复,值...

  • day04 【Map】

    day04 【Map】 主要内容 Map集合 教学目标 能够说出Map集合特点 使用Map集合添加方法保存数据 使...

网友评论

    本文标题:Map集合的修改问题

    本文链接:https://www.haomeiwen.com/subject/klibbxtx.html