Java基础三(equals() & hashCode())

这篇具有很好参考价值的文章主要介绍了Java基础三(equals() & hashCode())。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Java基础三(equals() & hashCode())

equals():

  1. 等价关系

两个对象具有等价关系,需要满足以下五个条件:

自反性

x.equals(x); // true

对称性

x.equals(y) == y.equals(x); // true

传递性

if (x.equals(y) && y.equals(z))
    x.equals(z); // true;

一致性

多次调用 equals() 方法结果不变

x.equals(y) == x.equals(y); // true

与 null 的比较

对任何不是 null 的对象 x 调用 x.equals(null) 结果都为 false

x.equals(null); // false;

  1. 等价与相等

对于基本类型,“== ”判断两个值是否相等,基本类型没有 equals() 方法
对于引用类型,“==” 判断两个变量是否引用同一个对象,而 equals() 判断引用的对象是否等价

Integer x = new Integer(1);
Integer y = new Integer(1);
System.out.println(x.equals(y)); // true
System.out.println(x == y);      // false
  1. 实现

检查是否为同一个对象的引用,如果是直接返回 true
检查是否是同一个类型,如果不是,直接返回 false
将 Object 对象进行转型;
判断每个关键域是否相等。

public class EqualExample {

    private int x;
    private int y;
    private int z;

    public EqualExample(int x, int y, int z) {
        this.x = x;
        this.y = y;
        this.z = z;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        EqualExample that = (EqualExample) o;

        if (x != that.x) return false;
        if (y != that.y) return false;
        return z == that.z;
    }
}

hashCode():

hashCode() 返回哈希值,而 equals() 是用来判断两个对象是否等价。等价的两个对象散列值一定相同,但是散列值相同的两个对象不一定等价,这是因为计算哈希值具有随机性,两个值不同的对象可能计算出相同的哈希值

在覆盖 equals() 方法时应当总是覆盖 hashCode() 方法,保证等价的两个对象哈希值也相等

HashSet 和 HashMap 等集合类使用了 hashCode() 方法来计算对象应该存储的位置,因此要将对象添加到这些集合类中,需要让对应的类实现 hashCode() 方法。

下面的代码中,新建了两个等价的对象,并将它们添加到 HashSet 中。我们希望将这两个对象当成一样的,只在集合中添加一个对象。但是 EqualExample 没有实现 hashCode() 方法,因此这两个对象的哈希值是不同的,最终导致集合添加了两个等价的对象。

EqualExample e1 = new EqualExample(1, 1, 1);
EqualExample e2 = new EqualExample(1, 1, 1);
System.out.println(e1.equals(e2)); // true
HashSet<EqualExample> set = new HashSet<>();
set.add(e1);
set.add(e2);
System.out.println(set.size());   // 2

理想的哈希函数应当具有均匀性,即不相等的对象应当均匀分布到所有可能的哈希值上。这就要求了哈希函数要把所有域的值都考虑进来。可以将每个域都当成 R 进制的某一位,然后组成一个 R 进制的整数。

R 一般取 31,因为它是一个奇素数,如果是偶数的话,当出现乘法溢出,信息就会丢失,因为与 2 相乘相当于向左移一位,最左边的位丢失。并且一个数与 31 相乘可以转换成移位和减法:31*x == (x<<5)-x,编译器会自动进行这个优化。

@Override
public int hashCode() {
    int result = 17;
    result = 31 * result + x;
    result = 31 * result + y;
    result = 31 * result + z;
    return result;
}

特别感谢及参考:

https://github.com/CyC2018/CS-Notes/blob/master/notes/Java%20%E5%9F%BA%E7%A1%80.md文章来源地址https://www.toymoban.com/news/detail-422872.html

到了这里,关于Java基础三(equals() & hashCode())的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第四章,向量组,2-矩阵等价与向量组等价的关系

    玩转线性代数(23)线性组合与线性表示的应用的笔记,相关证明以及例子见原文 设有 A m ∗ n B n ∗ l = C m ∗ l A_{m*n}B_{n*l}=C_{m*l} A m ∗ n ​ B n ∗ l ​ = C m ∗ l ​ ,那么A、B矩阵的行、列向量组与C的行、列向量组之间有什么关系呢? 先看C的行向量组, C = A B C=AB C = A B ,根据初

    2024年02月04日
    浏览(45)
  • 【JAVA基础】== 与 equals区别

    它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象(基本数据类型 比较的是值,引用数据类型 比较的是内存地址)。 基本数据类型 :byte,short,char,int,long,float,double,boolean。他们之间的比较,应用双等号(==),比较的是他们的值。 引用数据类型 :

    2024年02月11日
    浏览(39)
  • 【考研数学】矩阵三大关系的梳理和讨论 | 等价、相似、合同

    昨天学了矩阵的合同关系,老汤讲义里也列举了三大关系的定义和判别法,方便我们进行区分。但是光看还是难以入脑,为此,我想自己梳理一遍,顺带也复习一下线代之前的所学。 矩阵等价 —— 设 A , B pmb{A,B} A , B 为同型矩阵,若存在可逆矩阵 P , Q pmb{P,Q} P , Q ,使得 P

    2024年02月08日
    浏览(102)
  • C++ 具名要求-全库范围的概念 - 一种等价关系(operator==)- 是一种严格弱序关系(operator< )

    此页面中列出的 具名要求 ,是 C++ 标准的规范性文本中使用的具名要求,用于定义标准库的期待。 某些具名要求在 C++20 中正在以概念语言特性进行形式化。在那之前,确保以满足这些要求的模板实参实例化标准库模板是程序员的重担。若不这么做,则可能导致非常复杂的编

    2024年01月21日
    浏览(56)
  • 6.6---每天一点点--- Java基础之==和equals区别并举例说明(总复习+深入版)---详细+举例(小白也能看懂)

    1.== 为运算符,equal 为String数据类型的比较方法 相同内容的对象地址不一定相同,但相相同地址的对象内容一定相同;== 比较的是值是否相等,equal比较的是是否是同一个对象 2.把对象想象成一个房子,而引用则是门牌号。如果两个引用指向同一个房子,那么它们就是相等的

    2024年02月08日
    浏览(43)
  • Java中equals详解

    equals是在object类中的方法,在object中equals是用来看看 两个参数是否引用的是同一个对象 例: obj.equals(obj2) 若是返回true说明两者引用同一个对象 源码: 但是在我们实际开发中经常比较的是 两个对象的内容是否相等 ,因此就要重写equals,注意只能是 一个类里比 说到equals不得

    2023年04月08日
    浏览(58)
  • Java中的equals方法

    \\\"==\\\"是一个比较运算符。 \\\"==\\\"既可以判断基本类型,又可以判断引用类型。 \\\"==\\\"如果判断基本类型,判断的是值是否相等。eg: int i=10; double d=10.0 \\\"==\\\"如果判断引用类型,判断的是地址是否相等,即判定是不是同一个对象。 equals是object类中的方法,只能用于判断 引用类型 。 equa

    2024年02月03日
    浏览(38)
  • 【Java基础篇】方法的使用(方法的使用以及形参实参的关系)

    作者简介: 辭七七,目前大一,正在学习C/C++,Java,Python等 作者主页: 七七的个人主页 文章收录专栏 :Java.SE,本专栏主要讲解运算符,程序逻辑控制,方法的使用,数组的使用,类和对象,继承和多态,抽象类和接口等内容 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖 方

    2024年02月08日
    浏览(42)
  • equals方法的用法(java)

    equals 和 == 易错使用案例集合

    2024年02月16日
    浏览(35)
  • Java 中 == 与 equals() 的区别

    2024年02月15日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包