为什么重写equals时一定要重写hashcode
我们开发时写一个类,默认继承Object类,Object类的equals方法是比较是否指向同一个对象(地址是否相同),

Object类 的hashcode方法返回的对象内存地址的值,

一个类只重写了equals方法,不重写hashcode,那么对象equals为true(比较内容),但是hashcode为false(因为不同对象,地址不同)
那么对于hash散列表结构的容器集合,就会出现问题。
例如:有类Person如下,只重写了equals方法
 public class Person{
     private int id;
     private String name;
     public Person(int id,String name) {
         this.id = id;
         this.name = name;
     }
     public int getId() {
         return id;
     }
     public void setId(int id) {
         this.id = id;
     }
     public String getName() {
         return name;
     }
     public void setName(String name) {
         this.name = name;
     }
     @Override
     public boolean equals(Object obj) {
         if (this == obj)
             return true;
         if (obj == null)
             return false;
         if (getClass() != obj.getClass())
             return false;
         Person other = (Person) obj;
         if (id != other.id)
             return false;
         if (name == null) {
             if (other.name != null)
                 return false;
         } else if (!name.equals(other.name))
             return false;
         return true;
     }
 }
测试如下:
 public static void main(String[] args) {
         Person p1 = new Person(1,"tom");
         Person p2 = new Person(1,"tom");
         System.out.println("p1与p2是否相等:"+p1.equals(p2));
         System.out.println("p1 hashcode值:"+p1.hashCode());
         System.out.println("p2 hashcode值:"+p2.hashCode());
         // hashset集合值不允许重复
         Set<Person> set = new HashSet<>();
         set.add(p1);
         set.add(p2);
         System.out.println(set);
     }
运行结果如下:

因为hashmap,hashset等散列数据结构,会根据hashcode值计算存放在数组中桶的位置,上面两个对象的hashcode不同,所以
就会存放在数值中的不同位置,这样就会出现一个错误的结果。
如果重写hashcode方法呢?
运行结果如下:

总结:新建一个类,重写equals的同时一定要重写hashcode方法,否则使用散列表数据结构的容器时就会出现问题,
在重写equals和hashcode后,可以保证equals比较为true,hashcode比较一定为true,但是hashcode相同的两个对象,
equals不一定相同。
为什么重写equals时一定要重写hashcode的更多相关文章
- why在重写equals时还必须重写hashcode方法
		
首先我们先来看下String类的源码:可以发现String是重写了Object类的equals方法的,并且也重写了hashcode方法 public boolean equals(Object anO ...
 - 为什么重写equals时必须重写hashCode方法?(转发+整理)
		
为什么重写equals时必须重写hashCode方法? 原文地址:http://www.cnblogs.com/shenliang123/archive/2012/04/16/2452206.html ...
 - 讲解:为什么重写equals时必须重写hashCode方法
		
一 :string类型的==和equals的区别: 结论:"=="是判断两个字符串的内存地址是否相等,equals是比较两个字符串的值是否相等,具体就不做扩展了,有兴趣的同学可以去 ...
 - java -为什么重写equals(),还需要重写hashCode()?
		
1.先post这两个方法的基本定义: equals()的定义: 浅谈Java中的equals和==(转) hashCode()的定义: java中hashCode()方法的作用 Java中hashCo ...
 - 为什么重写equals的同时要重写hashcode
		
在覆盖equals方法的时候,你必须要遵守它的通用约定.下面是约定的内容,来自Object的规范[JavaSE6] 自反性.对于任何非null的引用值x,x.equals(x)必须返回true. 对称 ...
 - 为什么重写equals()方法就必须重写hashCode()方法
		
hashCode()和equals()保持一致,如果equals方法返回true,那么两个对象的hasCode()返回值必须一样.如果equals方法返回false,hashcode可以不一样,但是这 ...
 - 一文搞懂--Java中重写equals方法为什么要重写hashcode方法?
		
Java中重写equals方法为什么要重写hashcode方法? 直接看下面的例子: 首先我们只重写equals()方法 public class Test { public static void ...
 - 重写Equals为什么要同时重写GetHashCode
		
.NET程序员都知道,如果我们重写一个类的Equals方法而没有重写GetHashCode,则VS会提示警告 :“***”重写 Object.Equals(object o)但不重写 Object.G ...
 - 【转】重写Equals为什么要同时重写GetHashCode
		
.NET程序员都知道,如果我们重写一个类的Equals方法而没有重写GetHashCode,则VS会提示警告 :“***”重写 Object.Equals(object o)但不重写 Object.G ...
 
随机推荐
- C++ - STL - map的基础操作
			
STL - map常用方法 map简述 map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,其作用类似于 ...
 - Window下安装Nignx并且使用文档
			
1.下载nignx http://nginx.org/en/download.html 下载稳定版本,以nginx/Windows-1.12.2为例,直接下载 nginx-1.12.2 ...
 - oracle之percent_rank() over()函数和PERCENTILE_CONT() within group()over()函数详解
			
创建一个临时表 create table EMP ( EMPNO NUMBER(4) not null, ENAME VARCHAR2(10), JOB VARCHAR2(9), MGR NUMBER ...
 - 【大数据】虚拟机-Ubuntu环境
			
目标 1.宿主机器能相互访问 2.虚拟机能访问互联网 方法 1.VMWare--编辑---虚拟网络编辑器,选择宿主机上网网卡 2.虚拟机设置-网络适配器 3.宿主机网络设置查看 4.Ubuntu网络设 ...
 - GAME-BASED LEARNING
			
https://collegestar.org/modules/game-based-learning Introduction Appalachian State University Game ...
 - list转json数组
			
lights为arraylist java后台代码: try { org.tempuri.TLight[] lights = phlightSoapProxy.getLights(); ...
 - PHP - Filters
			
Retrieve the administrator password of this application. 对文件包含的介绍------------第一个链接需要谷歌 https://mediu ...
 - continue语句:编程把100-300之间的能被25整除的数输出
			
#include<stdio.h>void main(){ int n; for(n=100;n<=300;n++) { if(n%25!=0) continue; printf(& ...
 - 52: Luogu 4777 excrt
			
模板题 #include <bits/stdc++.h> using namespace std; ; #define LL long long int n; LL a[N], m[N]; ...
 - python格式化输出之format用法
			
format用法 相对基本格式化输出采用‘%’的方法,format()功能更强大,该函数把字符串当成一个模板,通过传入的参数进行格式化,并且使用大括号‘{}’作为特殊字符代替‘%’ 使用方法由两种:b ...