为了账号安全,请及时绑定邮箱和手机立即绑定

hashmap和hashcode和equals

标签:
Java

今天在群里和大家讨论hashmap的原理,还有些人对方法的hashcode和equal有疑问。花了点时间,简单写了一个demo。

如果hashmap的key是自己定义的对象。

package io.github.xwjie;

public class User{
    // FIXME ID 应该加final
    private long id;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public User(long id) {
        this.id = id;
    }

    @Override
    public int hashCode() {
        return Long.hashCode(this.id);
    }

    @Override
    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }

        if (anObject instanceof User) {
            User anotherUser = (User)anObject;
            return this.id == anotherUser.id;
        }

        return false;
    }
}

测试类:

package io.github.xwjie;

import java.util.HashMap;

/**
 * hashmap如果key是自己对象
 * 一般需要覆盖hashcode和equal方法
 *
 * 最重要的是:
 * 1. 对象放进去之后hashcode不能修改,否则找不出啦
 * 2. 即使equals总是false,也能找到!
 *
 * 原因:因为先比较hashcode,然后比较地址==,最后才是equals
 *
 * @author  https://xwjie.github.io/
 */
public class HashMapDemo {

    public static void main(String[] args) {
        // hashcode是int类型,是会重复的。
        System.out.println("BC".hashCode());
        System.out.println("Ab".hashCode());

        User user = new User(1L);

        // 如果map的key是自己定义的对象!
        HashMap<User, String> map = new HashMap<>();

        map.put(user, "放进去的数据");

        System.out.println("值为:" + map.get(user));

        // 如果id改了,导致hashcode改了,再也拿不出来了
        // key还是那个对象,并没有改变
        user.setId(2L);

        System.out.println("值为:" + map.get(user));

        // 所以hashcode要覆盖实现,和指定的关键信息绑定,而且这个字段不能改变
        // 如User对象的id必须加final,否则就是有bug
    }
}
结论

hashmap如果key是自己对象,一般需要覆盖hashcode和equal方法

最重要的是:

  1. 对象放进去之后hashcode不能修改,否则找不出啦
  2. 即使equals总是false,也能找到!

原因: 因为先比较hashcode,然后比较地址==,最后才是equals

-----code github -----

https://github.com/xwjie/springwebflux-ask/tree/master/basic/src/io/github/xwjie

点击查看更多内容
2人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消