Map集合的修改问题

0.前言

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

1.需求

用Map集合存储Book 和对应的 数量 即 Map

      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在这种情况下不会改变

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值