为什么重写equals还要重写HashCode?

  1. hashCode有什么作用?
   提高查询效率
   拿HashMap举例,在向HashMap的数组层放置元素时,如果不进行Hash运算,需要将放
   置的对象和数组中的每一个对象进行比较,有了HashCode之后,只需要对放置的对象
   进行%模运算,如果%模后的结果相等,先判断放置对象的hashcode与是否相等,再使
   用equals进行判断对象是否相等,如果equals相等,将新值替换旧值,并将旧值返回;
   
   // 为什么先判断hashCode是否相等再判断equals??
   因为 
   HashCode相等,对象不一定相等;
   对象相等,HashCode一定相等;
   HashCode不相等,对象则一定不等;
  1. 为什么重写equals?为什么重写HashCode?
  //为什么重写equals???
  // https://zhidao.baidu.com/question/326597100.html
  
  在比较两个对象时,equals默认使用的是==来比较内存地址值;而程序中更想得到的
  是比较对象的属性值,所以我们需要重写equals方法;
  
  //为什么重写hashCode???
  //https://blog.csdn.net/We_chuan/article/details/96426273
  根据对象相等,则equals一定相等;得出重写完equals之后一定要重写hashCode;

3.讲了理论来实践一下


	package com.example.demo;
	
	public class Student {
	
	    public String name;
	
	    public String getName() {
	        return name;
	    }
	
	    public void setName(String name) {
	        this.name = name;
	    }
	
		//重写equals
	    @Override
	    public boolean equals(Object o) {
	        if (this == o) return true;
	        if (o == null || getClass() != o.getClass()) return false;
	
	        Student student = (Student) o;
	
	        return name != null ? name.equals(student.name) : student.name == null;
	    }
	
		//重写hashCode
	    @Override
	    public int hashCode() {
	        return name != null ? name.hashCode() : 0;
	    }
	
	}
	
	package com.example.demo;
	
	import java.util.HashMap;
	
	public class Demo01 {
	
	    public static void main(String[] args) {
	        Student student = new Student();
	        Student student1 = new Student();
	
	        student.setName("111");
	        student1.setName("111");
	
			//没有重写equals之前返回false,重写equals返回true
	        System.out.println("对象"+student.equals(student1));
	
			//重写完hashCode之后对象的hashcode保持一致
			System.out.println("student.hashCode==>"+ student.hashCode());
	        System.out.println("student1.hashCode==>"+ student1.hashCode());
	
			//拿hashMap举例说明
	        HashMap<Student, String> studentStringHashMap = new HashMap<>();
	        //两次对象分别put
	        String put = studentStringHashMap.put(student, "1203");
	        String put1 = studentStringHashMap.put(student1, "456");
	        //当hashCode重写和equals重写之后发现student的值为456,说明这两个对象相等
	        System.out.println(studentStringHashMap.get(student));
	
	    }
	
	}

[大写的参考链接][http://blog.sina.com.cn/s/blog_a01ab79d0101bal3.html]

[参考链接01][https://www.cnblogs.com/lijinshan950823/p/9476569.html]

[参考链接02][https://www.cnblogs.com/szlbm/p/5504623.html]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值