继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

hashmap和hashcode和equals

晓风轻
关注TA
已关注
手记 22
粉丝 1.1万
获赞 1074

今天在群里和大家讨论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

打开App,阅读手记
2人推荐
发表评论
随时随地看视频慕课网APP

热门评论

好好好好好好好好好好

查看全部评论