尝试使用示例代码来检查默认行为equals()
and hashCode()
for record vs class,但它的行为似乎有所不同record相比于class.
这是代码示例record and class
public class EqualsAndHashcode {
public static void main(String[] args) {
var employeeA = new Employee(101);
var employeeB = new Employee(101);
var employeeAClass = new EmployeeClass(102);
var employeeBClass = new EmployeeClass(102);
var printStream = System.out;
printStream.println("record equals: " + employeeA.equals(employeeB) + "\nhashcode objA: " + employeeA.hashCode() + "\nhashcode objB: " + employeeB.hashCode());
printStream.println("\nclass equals: " + employeeAClass.equals(employeeBClass) + "\nhashcode objA: " + employeeAClass.hashCode() + "\nhashcode objB: " + employeeBClass.hashCode());
}
}
record Employee(int empId) {
}
class EmployeeClass {
int empId;
EmployeeClass(int empId) {
this.empId = empId;
}
}
上述代码执行后输出为:
record equals: true
hashcode objA: 101
hashcode objB: 101
class equals: false
hashcode objA: 935044096
hashcode objB: 396180261
任何人都可以帮助我了解记录的默认实现方式equals
and hashCode
与上面的行为不同?
如果有变化equals
and hashCode
实施记录,然后请帮助我了解该更改的确切目的是什么以及在哪些场景下使用它会更有帮助。
简而言之,区别很简单:
- 默认实现
equals()
and hashCode()
for java.lang.Object
永远不会将两个对象视为equal
除非它们是同一个对象(即它是“对象标识”,即x == y
).
- 默认实现
equals()
and hashCode()
for 记录将考虑所有组件(或字段)并比较它们是否相等(或考虑它们的哈希码)。如果它们都匹配那么.equals()
将返回true
and hashCode
将返回相同的值。
记录的详细信息java.lang.Object.hashCode() https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html#hashCode() are:
就合理实用而言,Object 类定义的 hashCode 方法为不同的对象返回不同的整数。
实际上,这意味着任何不覆盖的对象hashCode
其类型层次结构中的任何位置都将返回所谓的“身份哈希代码”,它实际上是一个任意但恒定的数字。
As for java.lang.Record.hashCode() https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Record.html#hashCode(), 它说:
隐式提供的实现返回通过组合来自每个组件的适当散列而派生的散列码值。隐式提供的实现中使用的精确算法未指定,并且可能会在上述限制内发生变化。即使组件值的散列以这种方式保持一致,从应用程序的一次执行到同一应用程序的另一次执行,所得到的整数不需要保持一致。此外,原始类型的组件可以将其位贡献给散列码,其方式不同于其原始包装类的散列码。
And for equals()
方法;
java.lang.Object.equals(Object obj) https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html#equals(java.lang.Object) :
Object 类的 equals 方法实现了对象上最具辨别力的可能等价关系;也就是说,对于任何非空参考值 x 和 y,当且仅当 x 和 y 引用同一个对象时此方法返回 true(x == y 的值为 true)。换句话说,在引用相等等价关系下,每个等价类只有一个元素。
java.lang.Record.equals(Object obj) https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Record.html#equals(java.lang.Object) :
当且仅当参数是与此记录相同的记录类的实例,并且此记录的每个组件等于参数的相应组件时,隐式提供的实现才返回 true;否则,返回 false。分量 c 的相等性确定如下:
如果组件是引用类型,当且仅当 Objects.equals(this.c, r.c 返回 true 时,组件才被视为相等。
如果组件是原始类型,使用相应的原始包装类 PW(int 的相应包装类是 java.lang.Integer 等),当且仅当 PW.compare(this. c, r.c) 将返回 0。
除了上述语义之外,隐式提供的实现中使用的精确算法未指定,并且可能会发生变化。该实现可能会也可能不会使用对列出的特定方法的调用,并且可能会也可能不会按照组件声明的顺序执行比较。
更多讨论请参见JEP 395:记录 https://openjdk.java.net/jeps/395.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)