San*_*San -1 java equals hashcode java-record java-17
尝试使用示例代码来检查recordequals()与classhashCode()的默认行为,但与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;
}
}
Run Code Online (Sandbox Code Playgroud)
上述代码执行后输出为:
record equals: true
hashcode objA: 101
hashcode objB: 101
class equals: false
hashcode objA: 935044096
hashcode objB: 396180261
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮助我理解记录的默认实现equals和hashCode行为与上述不同吗?
equals如果记录和实施有变化hashCode,那么请帮助我了解该变化的确切目的是什么以及在哪些场景下使用它会更有帮助。
Joa*_*uer 21
简而言之,区别很简单:
equals()和hashCode()for的默认实现java.lang.Object永远不会将两个对象视为equal同一个对象(即,它是“对象标识”,即x == y)。equals()和for 记录的默认实现hashCode()将考虑所有组件(或字段)并比较它们是否相等(或考虑它们的哈希码)。如果它们全部匹配,那么.equals()将返回true并且hashCode将返回相同的值。记录的详细信息java.lang.Object.hashCode()是:
就合理实用而言,Object 类定义的 hashCode 方法为不同的对象返回不同的整数。
实际上,这意味着任何不覆盖hashCode其类型层次结构中任何位置的对象都将返回所谓的“身份哈希码”,它实际上是一个任意但恒定的数字。
至于java.lang.Record.hashCode(),它说:
隐式提供的实现返回通过组合来自每个组件的适当散列而派生的散列码值。隐式提供的实现中使用的精确算法未指定,并且可能会在上述限制内发生变化。即使组件值的散列以这种方式保持一致,从应用程序的一次执行到同一应用程序的另一次执行,所得到的整数不需要保持一致。此外,原始类型的组件可以将其位贡献给散列码,其方式不同于其原始包装类的散列码。
对于equals()方法;
java.lang.Object.equals(Object obj):
Object 类的 equals 方法实现了对象上最具辨别力的可能等价关系;也就是说,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一对象(x == y 的值为 true)时,此方法才返回 true。换句话说,在引用相等等价关系下,每个等价类只有一个元素。
java.lang.Record.equals(Object obj):
当且仅当参数是与此记录相同的记录类的实例,并且此记录的每个组件等于参数的相应组件时,隐式提供的实现才返回 true;否则,返回 false。组件 c 的相等性确定如下: 如果组件是引用类型,则当且仅当 Objects.equals(this.c, rc 将返回 true 时,才认为组件相等。如果组件是基本类型,使用相应的原始包装类 PW(int 的相应包装类是 java.lang.Integer 等),当且仅当 PW.compare(this.c, rc) 返回 0 时,该组件才被视为相等。从上述语义来看,隐式提供的实现中使用的精确算法是未指定的,并且可能会发生变化。该实现可能会或可能不会使用对列出的特定方法的调用,并且可能会或可能不会按照组件声明的顺序执行比较。
有关更多讨论,请参阅JEP 395:记录。
| 归档时间: |
|
| 查看次数: |
4402 次 |
| 最近记录: |