我们开发时写一个类,默认继承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的更多相关文章

  1. why在重写equals时还必须重写hashcode方法

    首先我们先来看下String类的源码:可以发现String是重写了Object类的equals方法的,并且也重写了hashcode方法 public boolean equals(Object anO ...

  2. 为什么重写equals时必须重写hashCode方法?(转发+整理)

    为什么重写equals时必须重写hashCode方法? 原文地址:http://www.cnblogs.com/shenliang123/archive/2012/04/16/2452206.html ...

  3. 讲解:为什么重写equals时必须重写hashCode方法

    一 :string类型的==和equals的区别: 结论:"=="是判断两个字符串的内存地址是否相等,equals是比较两个字符串的值是否相等,具体就不做扩展了,有兴趣的同学可以去 ...

  4. java -为什么重写equals(),还需要重写hashCode()?

    1.先post这两个方法的基本定义: equals()的定义: 浅谈Java中的equals和==(转) hashCode()的定义: java中hashCode()方法的作用 Java中hashCo ...

  5. 为什么重写equals的同时要重写hashcode

    在覆盖equals方法的时候,你必须要遵守它的通用约定.下面是约定的内容,来自Object的规范[JavaSE6] 自反性.对于任何非null的引用值x,x.equals(x)必须返回true. 对称 ...

  6. 为什么重写equals()方法就必须重写hashCode()方法

    hashCode()和equals()保持一致,如果equals方法返回true,那么两个对象的hasCode()返回值必须一样.如果equals方法返回false,hashcode可以不一样,但是这 ...

  7. 一文搞懂--Java中重写equals方法为什么要重写hashcode方法?

    Java中重写equals方法为什么要重写hashcode方法? 直接看下面的例子: 首先我们只重写equals()方法 public class Test { public static void ...

  8. 重写Equals为什么要同时重写GetHashCode

    .NET程序员都知道,如果我们重写一个类的Equals方法而没有重写GetHashCode,则VS会提示警告 :“***”重写 Object.Equals(object o)但不重写 Object.G ...

  9. 【转】重写Equals为什么要同时重写GetHashCode

    .NET程序员都知道,如果我们重写一个类的Equals方法而没有重写GetHashCode,则VS会提示警告 :“***”重写 Object.Equals(object o)但不重写 Object.G ...

随机推荐

  1. 项目Alpha冲刺(团队) -- 总结及汇总

    项目Alpha冲刺(团队) --总结 1.团队信息 团队名 :男上加男 成员信息 : 队员学号 队员姓名 个人博客地址 备注 221600427 Alicesft https://www.cnblog ...

  2. MySQL中的内连接、左连接、右连接、全连接、交叉连接

    创建两个表(a_table.b_table),两个表的关联字段分别为:a_table.a_id和b_table.b_id CREATE TABLE a_table ( a_id int NOT NUL ...

  3. es6 函数解构的用途

    es6的变量解构赋值很方便,那具体有哪些用途呢? 1.变换变量的值 let n = 10; let m = 20; [n, m] = [m, n] 这样n , m 的值 会互换, 即:n = 20, ...

  4. vue 自定义过滤器

    vue允许自定义过滤器,被用作一些常见文本的格式化.由“管道符”指示,格式如下: <!-- 在两个大括号中 --> {{message | capitalize}}   <!-- 在 ...

  5. 【城市天气】使用Ajax发送和接受数据

    任务:利用中国天气网的公开接口,实现天气预报的查询功能 实验的功能要求如下: (1)当网页加载时,根据所给的 json 数据解析获得省(直辖市)的信息并显示在下拉列表框中供用户选择: (2)当用户选择 ...

  6. Numpy | 07 从数值范围创建数组

    numpy.arange ***** 使用numpy 包中的 arange 函数,创建数值范围并返回 ndarray 对象,函数格式如下: numpy.arange(start, stop, step ...

  7. ssh配置连接远程主机 彻底解放你的双手

    查看ssh支持配置 man ssh_config 打开ssh并配置 vi ~/.ssh/config 基本配置示例说明 密钥文件连接 Host <别名> Port <机器端口号> ...

  8. A_G_C_007

    AGC007 A Shik and Stone 我是沙比这都能蛙一发 https://agc007.contest.atcoder.jp/submissions/7946110 B Construct ...

  9. Java动态调用脚本语言Groovy

    Java动态调用脚本语言Groovy 2019-05-15 目录 0. pom.xml添加依赖1. 使用GroovyShell计算表达式2. 使用GroovyScriptEngine脚本引擎加载Gro ...

  10. 修改git 的远程URL

    git remote set-url origin ssh://git@gitlab.tian-wang.com:8022/test/api-automation.git