美文网首页
==和equals()以及hashCode

==和equals()以及hashCode

作者: atdoking | 来源:发表于2021-03-11 23:11 被阅读0次

    ==和equals()区别

    equals是判断两个变量或者实例指向同一个内存空间的值是不是相同

    而==是判断两个变量或者实例是不是指向同一个内存空间

    举个通俗的例子来说,==是判断两个人是不是住在同一个地址,而equals是判断同一个地址里住的人是不是同一个

    equals和hashCode都是Object对象中的非final方法,它们设计的目的就是被用来覆盖(override)的,所以在程序设计中还是经常需要处理这两个方法

    hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在JDK的Object.java中,这就意味着Java中的任何类都包含有hashCode() 函数。

    equals它的作用也是判断两个对象是否相等,如果对象重写了equals()方法,比较两个对象的内容是否相等;如果没有重写,比较两个对象的地址是否相同,价于“==”。同样的,equals()定义在JDK的Object.java中,这就意味着Java中的任何类都包含有equals()函数

    下面是官方文档给出的一些说明:

    hashCode 的常规协定是:
    在 Java 应用程序执行期间,在同一对象上多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是对象上 equals 比较中所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
    如果根据 equals(Object) 方法,两个对象是相等的,那么在两个对象中的每个对象上调用 hashCode 方法都必须生成相同的整数结果。
    以下情况不 是必需的:如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么在两个对象中的任一对象上调用 hashCode 方法必定会生成不同的整数结果。但是,程序员应该知道,为不相等的对象生成不同整数结果可以提高哈希表的性能。
    实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)

    当equals方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
    对以上的说明做的归纳总结:

    1.若重写了equals(Object obj)方法,则有必要重写hashCode()方法。

    2.若两个对象equals(Object obj)返回true,则hashCode()有必要也返回相同的int数。

    3.若两个对象equals(Object obj)返回false,则hashCode()不一定返回不同的int数。

    4.若两个对象hashCode()返回相同int数,则equals(Object obj)不一定返回true。

    5.若两个对象hashCode()返回不同int数,则equals(Object obj)一定返回false。

    6.同一对象在执行期间若已经存储在集合中,则不能修改影响hashCode值的相关信息,否则会导致内存泄露问题。

    相关文章

      网友评论

          本文标题:==和equals()以及hashCode

          本文链接:https://www.haomeiwen.com/subject/pnqaqltx.html