温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java中怎么重写equals和hashCode

发布时间:2023-04-26 10:33:18 来源:亿速云 阅读:72 作者:iii 栏目:开发技术

这篇文章主要介绍“Java中怎么重写equals和hashCode”,在日常操作中,相信很多人在Java中怎么重写equals和hashCode问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中怎么重写equals和hashCode”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

Java中为什么重写equals()也需要重写hashCode()

所有类默认继承Object类 先看一下Object源码

package java.lang;
public class Object {
	//默认调用本地的hashcode()方法 根据内存地址生成hash值 避免不了哈希冲突
	public native int hashCode();
	//默认调用的equals方法比较的是'=='比较
	//基本类型比较的是两者的值是否相同 而引用类型比较两者的是引用地址(对象)是否相同
	public boolean equals(Object obj) {
		return (this == obj);
    }
}
  • equals()返回结果为true hashCode()一定相同

  • '=='结果为true hashCode()一定相同

  • '=='结果为false hashCode()有可能相同(哈希冲突)

hashCode()重写规范就是保证equals()相同的两个对象拥有相同的哈希值

回到刚刚哪个问题 为什么重写equals还要重写hashCode()?

关注公众号:Java技术迷,获取java相关书籍!

public class per {
    private String name;
    private int age;
    public per(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public boolean equals(Object o){
        if (this==o)return true;
        if (o==null||o.getClass()!=this.getClass())return false;
        per o1 = (per) o;
        return o1.name==name&&o1.name!=null&&o1.name.equals(this.name)&&age=o1.age;
    }
    public int hashCode(){
        return Objects.hash(name,age);
    }
	/*
	这是Object类中的规范如果不同时重写将会导致很多类库出现业务不一致!
	例如HashMap无法保证key值'唯一性'
	下面测试代码p1和p2虽然地址不同 但是业务上看内容是相同的
	所以应该只用一个key表示 但是不重写将无法正确插入!
	*/
}
class Example{
    public static void main(String[] args) {
        per p1 = new per("张三", 18);
        per p2 = new per("张三", 18);
        HashMap<per,Integer> map = new HashMap<>();
        map.put(p1,1);
        map.put(p2,2); //具体原理可以看put(k,v)源码!
    }
}

到此,关于“Java中怎么重写equals和hashCode”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI