equals与Hashcde的区别

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

1、equals与hashCode的区别

equals与hashcode这两个方法都是从Object类中继承过来的。

hashCode():计算出对象实例的哈希地址,并且返回该地址,称哈希函数,又称散列表。

equals():反映的是对象的内存地址或者对象的内容是否相等。

Objeact类实现equals()是对两个对象的地址进行比较(即比较是否相同,也就是内存地址是否相等)。

Object类实现hashCode()方法,其实就是调用C++编写的本地方法,可以理解为产生一个随机数的本地方法。

Java中的两个规则:

1、规则一

如果equals比较的对象的内容相等,那么hashCode一定相等。

2、规则二

如果equals比较的对象内容不相等,那么HashCode也可能相等,也可能不相等。

equals与Hashcde的区别,java,开发语言

所以:HashCode如果相同的话,那么对象的值不一定相同。

变量a,b hashCode值相同的原因是,Integer和String类都对hashCode进行重写。

规则三:HashCode如果相等的情况下,equals比较对象不一定相等。(根据规则一、二推出)。

规则四:HashCode如果不相等的情况下,equas比较对象一定不相等(根据规则一、二推出)。

class Dog{
    private String name;
    private int age;

    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
public class Test {
    public static void main(String[] args) {
        Dog dog1=new Dog("huahua",11);
        Dog dog2=new Dog("huahua",11);
        System.out.println("dog1的hashcode:"+dog1.hashCode());
        System.out.println("dog2的hashcode:"+dog2.hashCode());
        System.out.println("dog1和dog2的比较结果:"+dog1.equals(dog2));
    }
}
//运行结果:
//dog1的hashcode:460141958
//dog2的hashcode:1163157884
//dog1和dog2的比较结果:false

我们看见比较对象相同,但是hashcode也不相同,违背了规则一,因为我们没有重写,equals

方法。

class Dog{
    private String name;
    private int age;

    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object obj) {
        Dog dog=(Dog) obj;
        return this.age== dog.age&&this.name.equals(dog.name);
    }
}
public class Test {
    public static void main(String[] args) {
        Dog dog1=new Dog("huahua",11);
        Dog dog2=new Dog("huahua",11);
        System.out.println("dog1的hashcode:"+dog1.hashCode());
        System.out.println("dog2的hashcode:"+dog2.hashCode());
        System.out.println("dog1和dog2的比较结果:"+dog1.equals(dog2));
    }
}
//运行结果:
//dog1的hashcode:460141958
//dog2的hashcode:1163157884
//dog1和dog2的比较结果:true

此时我们可以看到比较对象相同,但是hashcode的值确实不相同的,是因为我们没有重写hashcode。文章来源地址https://www.toymoban.com/news/detail-578437.html

class Dog{
    private String name;
    private int age;

    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public int hashCode() {
        return Objects.hash(name,age);
    }

    @Override
    public boolean equals(Object obj) {
        Dog dog=(Dog) obj;
        return this.age== dog.age&&this.name.equals(dog.name);
    }
}
public class Test {
    public static void main(String[] args) {
        Dog dog1=new Dog("huahua",11);
        Dog dog2=new Dog("huahua",11);
        System.out.println("dog1的hashcode:"+dog1.hashCode());
        System.out.println("dog2的hashcode:"+dog2.hashCode());
        System.out.println("dog1和dog2的比较结果:"+dog1.equals(dog2));
    }
}
//运行结果:
//dog1的hashcode:1253509196
//dog2的hashcode:1253509196
//dog1和dog2的比较结果:true

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

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

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

相关文章

  • 【Java扫盲篇】==和equals的区别

    这是一道面试经典题,面试官对你说:小伙子,请你说说 == 和 equals 的区别 对于==来说 如果比较的是基本数据类型,那么==比较的是数据的值是否相同。注意: (与数据类型无关) 如果比较的是引用数据类型,那么==比较的是两个对象的地址是否相同,即两个引用是否指向同

    2024年03月23日
    浏览(33)
  • Java面试题: == 和 equals() 区别,toString方法

    == :运算符 可以使用在基本数据类型变量和引用数据类型变量中 如果比较的是基本数据类型变量:比较两个变量保存的数据是否相等。(不一定类型要相同) 如果比较的是引用数据类型变量:比较两个对象的地址值是否相同.即两个引用是否指向同一个对象实体 补充: == 符

    2024年02月08日
    浏览(47)
  • Java中==和equals的区别,包装类对比、String和new String

            对于这个问题,我们得了解基本类型和引用类型在内存中的结构,具体如下: 引用对象句柄访问: 引用对象直接指针访问:           可以看出,无论哪种方式访问基本类型和引用类型的实例数据,基本类型的内存上是保存值,而引用类型的内存上是保存指针

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

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

    2024年02月08日
    浏览(43)
  • 【Java】后端开发语言Java和C#,两者对比注解和属性的区别以及作用

    欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是《Java》序列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握。 温馨提示:博主能力有限,理解水平有限

    2024年01月16日
    浏览(53)
  • Object.equals 和 String.equals的区别

    一.  源码展示: 1. Object.equals: ①引用类型地址值比较,直接返回结果:true || false   2. String.equals: ① 判断地址值是否相等,若相等 返回 true,若不等则进入下列判断 ; ② 判断参数是否为String类型,若不是 返回false,若是则进入下列判断; ③ 判断字符串长度是否相等,若不

    2024年02月13日
    浏览(41)
  • == 与 equals 的区别?

    一. 介绍: Java中的 \\\"==\\\"  是一个运算符,是用于比较两个对象地址值或基本数据类型之间的值是否相等。它的来源可以追溯到C语言,以及受C语言影响的许多其他编程语言。 Java中的equals() 是一个方法,可重写该方法用于比较两个对象属性内容是否相等的方法。该方法继承自

    2024年02月13日
    浏览(29)
  • “==“和equals方法究竟有什么区别?

    ==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用 ==操作符。 如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内

    2023年04月17日
    浏览(31)
  • 带你完全掌握== 和equals区别

    首先说一下==和equals之间的区别: == 如果比较的是基本数据类型 则比较的是其中的值,如果比较的是对象的话,比较的是其中的内存地址,看个案例: 可以看出基本数据类型是可以使用==进行判断是否相等,引用数据类型则不能,那应该怎么办呢? 这个时候 我们要使用equ

    2024年02月15日
    浏览(36)
  • c# ==操作符和equals方法的区别

    在C#中,\\\"==\\\"操作符和Equals()方法有着不同的用途和行为。 \\\"==\\\"操作符: \\\" “操作符用于比较两个对象的值是否相等。当使用” \\\"操作符比较两个引用类型的对象时,它会比较它们的引用是否指向相同的内存地址。 对于值类型(如int、double等),\\\"==\\\"操作符比较它们的实际值。如

    2024年01月23日
    浏览(47)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包