hashcode和equals的区别

 2024-11-01 17:27:01  阅读 434  评论 0

摘要:equals和hashCode方法主要的区别在于:性能,可靠性;对于需要大量并且快速对比,如果都用equals比较效率太低,所以每当需要对象比较时,先用hashCode对比,如果hashCode值不一样,两对象肯定不相等,也就没必要再用equals比较。一、hashcode和equals的区别equals和hashCode方

equals和hashCode方法主要的区别在于:性能,可靠性;对于需要大量并且快速对比,如果都用equals比较效率太低,所以每当需要对象比较时,先用hashCode对比,如果hashCode值不一样,两对象肯定不相等,也就没必要再用equals比较。

一、hashcode和equals的区别

hashcode和equals的区别

equals和hashCode方法主要的区别在于:性能,可靠性;

equals方法:因为hashCode并不是完全可靠的,有时候不同的对象生成的hashCode也可能一样(生成hashCode值的公式可能存在问题),所以hashCode并不是完全可靠的,只能通过equals保证两个对象确实相等。

hashCode方法:因为重写equals方法比较复杂,调用equals方法比较对象是否相等的效率比较低,而利用hashCode进行对比,只需要生成一个hash值进行比较就可以,效率较高。

实际应用:对于需要大量并且快速对比,如果都用equals比较效率太低,所以每当需要对象比较时,先用hashCode对比,如果hashCode值不一样,两对象肯定不相等,也就没必要再用equals比较,如果hashCode相等,再用equals对比,euqals相同则表示这两个对象确实相同,既提高了执行效率也保证了可靠性。

java中的equals,hashcode的区别和联系

equals

public boolean equals(Object obj)

指示其他某个对象是否与此对象“相等”。

equals 方法在非空对象引用上实现相等关系:

自反性:对于任何非空引用值 x,x.equals(x) 都应返回 

true。

对称性:对于任何非空引用值 x 和 y,当且仅当 

y.equals(x) 返回 true 时,x.equals(y) 才应返回 

true。

传递性:对于任何非空引用值 x、y 和 z,如果 

x.equals(y) 返回 true,并且 y.equals(z) 返回 

true,那么 x.equals(z) 应返回 true。

一致性:对于任何非空引用值 x 和 y,多次调用 

x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 

equals 比较中所用的信息没有被修改。

对于任何非空引用值 x,x.equals(null) 都应返回 

false。

Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 

x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。

注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

参数:

obj - 要与之比较的引用对象。

返回:

如果此对象与 obj 参数相同,则返回 true;否则返回 false。

另请参见:

hashCode(), HashtablehashCode

public int hashCode()

返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。

hashCode 的常规协定是:

在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 

equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。

如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 

hashCode 方法都必须生成相同的整数结果。

如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。

实际上,由 Object 类定义的 hashCode 

方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)

返回:

此对象的一个哈希码值。

另请参见:

equals(java.lang.Object), 

Hashtable

也就是说equals和hashCode的关系只是在于一个协定,equals默认判断依据是对象是否相等,hashCode()得到对象的内存地址的一个特殊计算得到的值,协定内容是:equals相等的对象的hashCode值相等,所以要求重写了equals之后重写hashCode。

equals是判断对象是否相等的方法。hashCode是得到对象hash值的方法,对象hash值默认是根据内存地址计算得到。equals默认表的是对象内存地址。

hashcode和equals,怎么理解这段话,最好举例

两个非基本类型变量进行比较时,先比较两个对象的hashcode,如果不一致就认为是不相等的,直接返回结果,如果相等会接着调用equals方法进行判断,如果你需要自定义比较规则,那么就需要重写hashcode和equals方法,比如有一个类User,有一个属性name,我们认为name相等那么两个对象就相等,这种情况就需要重写equals和hashcode方法:

如果不重写就会调用Object的hashcode和equals方法,原理如下:

public class User {

    private String name

    public String getName() {

        return name

    }

    public void setName(String name) {

        this.name = name

    }

    @Override

    public int hashCode() {

        // 返回的是对象的内存地址

        return super.hashCode()

    }

    @Override

    public boolean equals(Object obj) {

        // 可查看源码发现调用的是(this == obj),说明比较的还是内存地址

        return super.equals(obj)

    }

}

要实现上面的需求就需要重写hashcode()和equals():

public class User {

    private String name

    public String getName() {

        return name

    }

    public void setName(String name) {

        this.name = name

    }

    @Override

    public int hashCode() {

        return name.hashCode()

    }

    @Override

    public boolean equals(Object obj) {

        if (obj == null) {

            return false

        }

        if (obj instanceof User) {

            return name.equals(((User) obj).getName())

        }

        return false

    }

}

如果我们只是重写了equals而没有重写hashcode,那么两个对象比较时

User user1 = new User()

user1.setName("lily")

User user2 = new User()

user2.setName("lily")

boolean b = user1.equals(user2)

由于user1和user2是两个对象,所以user1和user2的hashcode肯定是不相等的,那么会直接返回false,不会进入equals方法比较,就不会达到预期的需求。

hashcode和equals的关系是什么?

hashcode和equals的关系如下:

1、如果两个对象equals相等,那么这两个对象的HashCode一定也相同。

2、在重写了equals方法后,尽量也重写了hashcode方法,通过一定的算法,使他们在equals相等时,也会有相同的hashcode值。

3、hashcode就是在hash表中对应的位置。

hashcode和equals的特点

hashcode代表对象的地址说的是对象在hash表中的位置,物理地址说的对象存放在内存中的地址。HashCode的存在主要是为了查找的快捷性,HashCode是用来在散列存储结构中确定对象的存储地址的(后半句说的用hashcode来代表对象就是在hash表中的位置)。

版权声明:我们致力于保护作者版权,注重分享,被刊用文章【hashcode和equals的区别】因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!;

原文链接:https://www.yxiso.com/news/120182.html

发表评论:

关于我们
院校搜的目标不仅是为用户提供数据和信息,更是成为每一位学子梦想实现的桥梁。我们相信,通过准确的信息与专业的指导,每一位学子都能找到属于自己的教育之路,迈向成功的未来。助力每一个梦想,实现更美好的未来!
联系方式
电话:
地址:广东省中山市
Email:beimuxi@protonmail.com

Copyright © 2022 院校搜 Inc. 保留所有权利。 Powered by BEIMUCMS 3.0.3

页面耗时0.0463秒, 内存占用2 MB, 访问数据库23次

陕ICP备14005772号-15