equals 方法

equals 方法需要满足的规范:

  1. 自反性: 对于任意非空引用 x, x.equals(x) 应该返回 true;
  2. 对称性: 对于任意引用, 当且仅当 x.equals(y) == true 时, y.equals(x) == true;
  3. 传递性: 对于任意引用 x/y/z, 如果 x.equals(y) == truey.equals(z) == true, 则 x.equals(z) == true;
  4. 对于任意非空引用 x, x.equals(null) == false;

编写 equals() 方法的建议:

  1. 添加 @Override 注解, 重载父类 Object.equals(Object) 方法;
  2. 参数为 Object otherObject, 稍后需要将它转换成另一个叫做 other 的变量;
  3. 检测 thisotherObject 是否引用同一个对象;
  4. 检测 otherObject 是否为 null, 如果为 null, 返回 false;
  5. 比较 thisotherObject 是否属于同一个类.

    如果 equals 的语义在每个子类中有所改变, 那就要使用 getClass 检测;
  6. otherObject 转换为响应的类型变量 other;
  7. 对所有需要比较的域进行比较, 使用 == 比较基本类型域, 使用 equals 比较对象域. 如果所有的域都匹配, 就返回 true, 否则返回 false;
  8. 如果在子类中重新定义了 equals, 就要在其中调用 super.equals(otherObject), 如果返回 ture, 则继续比较子类特有的域.

在比较两个对象是否相等时, 可使用 Objects.equals() 方法.

例如对于 Objects.equals(a, b):

  • 当两个参数都为 null 时, 返回 ture;
  • 当其中一个参数为 null 时, 返回 false;
  • 当两个参数都不为 null 时, 返回 a.equals(b) 的返回值.

hashCode 方法

如果重新定义了 equals 方法, 就必须重新定义 hashCode 方法, 以便用户将对象插入到散列表中.

hashCode 方法应该返回一个整型数值(也可以是负数), 并合理地组织实例域的散列码, 以便能够让哥哥不同的对象产生的散列码更加均匀.

Objects.hash(Object.. value) 可以传递多个参数并据此产生序列码.

示例代码:

import java.util.Objects;

public class TestEqualsAndHashCode {
private Object obj; public Object getObj() {
return obj;
} public void setObj(Object obj) {
this.obj = obj;
} @Override
public boolean equals(Object otherObject) {
if (this == otherObject) {
return true;
} if (null == otherObject) {
return false;
} if (getClass() != otherObject.getClass()) {
return false;
} TestEqualsAndHashCode other = (TestEqualsAndHashCode) otherObject;
return Objects.equals(getObj(), other.getObj());
} @Override
public int hashCode() {
return Objects.hash(obj);
} public static void main(String[] args) {
TestEqualsAndHashCode a = new TestEqualsAndHashCode();
TestEqualsAndHashCode b = new TestEqualsAndHashCode();
a.setObj(1);
b.setObj(1); System.out.println(Objects.equals(a, b));
System.out.println(a.hashCode());
System.out.println(b.hashCode());
}
}

重新 java 对象的 equals 和 hashCode 方法的建议和示例代码的更多相关文章

  1. Java中的equals和hashCode方法

    本文转载自:Java中的equals和hashCode方法详解 Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要 ...

  2. Java中的equals和hashCode方法详解

    Java中的equals和hashCode方法详解  转自 https://www.cnblogs.com/crazylqy/category/655181.html 参考:http://blog.c ...

  3. 解析Java对象的equals()和hashCode()的使用

    解析Java对象的equals()和hashCode()的使用 前言 在Java语言中,equals()和hashCode()两个函数的使用是紧密配合的,你要是自己设计其中一个,就要设计另外一个.在多 ...

  4. 转:Java中的equals和hashCode方法详解

    转自:Java中的equals和hashCode方法详解 Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要重写这 ...

  5. Java提高篇——equals()与hashCode()方法详解

    java.lang.Object类中有两个非常重要的方法: 1 2 public boolean equals(Object obj) public int hashCode() Object类是类继 ...

  6. java集合(3)- Java中的equals和hashCode方法详解

    参考:http://blog.csdn.net/jiangwei0910410003/article/details/22739953 Java中的equals方法和hashCode方法是Object ...

  7. List集合去除重复对象及equals()、hashCode()方法的作用

    原文:https://blog.csdn.net/freelander_j/article/details/52211010 在java中,要将一个集合中重复的对象除去,如果这个集合中的数据类型是基本 ...

  8. java中equals和hashCode方法的解析

    解析Java对象的equals()和hashCode()的使用 前言 在Java语言中,equals()和hashCode()两个函数的使用是紧密配合的,你要是自己设计其中一个,就要设计另外一个.在多 ...

  9. Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例(转)

    Java中==.equals.hashcode的区别与重写equals以及hashcode方法实例  原文地址:http://www.cnblogs.com/luankun0214/p/4421770 ...

随机推荐

  1. [thinkphp] U方法域名支持

    域名支持如果你的应用涉及到多个子域名的操作地址,那么也可以在U方法里面指定需要生成地址的域名,例如: U('Blog/read@blog.thinkphp.cn','id=1'); @后面传入需要指定 ...

  2. [orangehrm] 安装问题集合

    Web server allows .htaccess files # 这一项检查不通过 解决: In conf/extra/httpd-vhosts.conf, add the line Allow ...

  3. web.input()和web.data() 遇到特殊字符

    使用web.py的时候,web.input()和web.data() 都可以接收用户从浏览器端输入的参数. web.input()方法返回一个包含从url(GET方法)或http header(POS ...

  4. CSS 从入门到放弃系列:CSS的选择器和优先级

    CSS的选择器和优先级 CSS的N种选择器 !important 其实这个玩意不算什么选择器,放在这只是为了突出这个选择器优先级或者说权重的从高到低而已.. 内联方式(行间样式) <div st ...

  5. poj3233(等比矩阵求和)

    poj3233 题意 给出一个 \(n \times n\) 的矩阵 \(A\) ,求 \(A + A^2 + A^3 + ... + A^k\) . 分析 构造矩阵 \[ \begin{bmatri ...

  6. 51nod 子序列的个数(动态规划)

    子序列的个数 给定一个正整数序列,序列中元素的个数和元素值大小都不超过105, 求其所有子序列的个数.注意相同的只算一次:例如 {1,2,1}有子序列{1} {2} {1,2} {2,1}和{1,2, ...

  7. ASP.NET Core 2.2 基础知识(六) 配置(内含MySql+EF)

    先上一段代码,了解一下 .NET Core 配置数据的结构. 新建一个 控制台项目,添加一个文件 json.json ,文件内容如下: { "country": "cn& ...

  8. 【博弈论】【SG函数】【找规律】Gym - 101147A - The game of Osho

    以后这种题还是不能空想,必须打个表看看,规律还是比较好找的……具体是啥看代码.用SG函数暴力的部分就不放了. #include<cstdio> using namespace std; i ...

  9. 【数论】【欧拉函数】【筛法求素数】【乘法逆元】【快速幂取模】bzoj2186 [Sdoi2008]沙拉公主的困惑

    http://www.cnblogs.com/BLADEVIL/p/3490321.html http://www.cnblogs.com/zyfzyf/p/3997986.html 翻了翻题解,这两 ...

  10. 泳池迷宫(p24)

    /*2018年8月26日15:55:29作者:冰樱梦page-24泳池迷宫*/public class swiming{public static void main(String[] args){i ...