equalsandhashcode(hashcode和equals的关系是什么)
本文目录
hashcode和equals的关系是什么
hashcode和equals的关系如下:
1、如果两个对象equals相等,那么这两个对象的HashCode一定也相同。
2、在重写了equals方法后,尽量也重写了hashcode方法,通过一定的算法,使他们在equals相等时,也会有相同的hashcode值。
3、hashcode就是在hash表中对应的位置。
hashcode和equals的特点
hashcode代表对象的地址说的是对象在hash表中的位置,物理地址说的对象存放在内存中的地址。HashCode的存在主要是为了查找的快捷性,HashCode是用来在散列存储结构中确定对象的存储地址的(后半句说的用hashcode来代表对象就是在hash表中的位置)。
equals和hashcode的区别,hashcode的作用
equals():反映的是对象或变量具体的值,即两个对象里面包含的值--可能是对象的引用,也可能是值类型的值。hashCode():计算出对象实例的哈希码,并返回哈希码,又称为散列函数。根类Object的hashCode()方法的计算依赖于对象实例的D(内存地址),故每个Object对象的hashCode都是唯一的;当然,当对象所对应的类重写了hashCode()方法时,结果就截然不同了。 之所以有hashCode方法,是因为在批量的对象比较中,hashCode要比equals来得快,很多集合都用到了hashCode,比如HashTable。 两个obj,如果equals()相等,hashCode()一定相等。 两个obj,如果hashCode()相等,equals()不一定相等(Hash散列值有冲突的情况,虽然概率很低)。所以: 可以考虑在集合中,判断两个对象是否相等的规则是: 第一步,如果hashCode()相等,则查看第二步,否则不相等; 第二步,查看equals()是否相等,如果相等,则两obj相等,否则还是不相等。 1、首先equals()和hashcode()这两个方法都是从object类中继承过来的。 equals()是对两个对象的地址值进行的比较(即比较引用是否相同)。 hashCode()是一个本地方法,它的实现是根据本地机器相关的。2、Java语言对equals()的要求如下,这些要求是必须遵循的: A 对称性:如果x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true”。 B 反射性:x.equals(x)必须返回是“true”。 C 类推性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true”。 D 一致性:如果x.equals(y)返回是“true”,只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是“true”。 任何情况下,x.equals(null),永远返回是“false”;x.equals(和x不同类型的对象)永远返回是“false”。3、equals()相等的两个对象,hashcode()一定相等; 反过来:hashcode()不等,一定能推出equals()也不等; hashcode()相等,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方法比较,就不会达到预期的需求。
更多文章:

buy up(buy up 和 buying up 的区别)
2025年3月27日 17:40

tcpip协议包括哪两个核心协议(TCP/IP网络体系结构中,各层内分别有什么协议,每一种协议的作用是什么)
2025年3月3日 08:00

asynctask源码分析(android.os.asynctask需要什么jar包)
2025年3月28日 06:20

netlink光纤收发器使用说明(光纤收发器六个指示灯说明和指示的功能分别是什么)
2025年3月17日 12:30

txt转json在线工具(如何使用JSON 转换工具详细解析)
2025年3月12日 11:50

自学网ps基础视频教程(零基础怎么自学PS有什么好的网站和方法分享一下)
2025年3月10日 11:00

thinner造句(用heavier,longer,thinner,smaiier分别造句)
2025年3月16日 03:40

settimeout mdn(Node.js的HTTP与事件初步介绍&怎么查看API)
2025年4月3日 13:50