下面是记录和类的代码示例
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
有谁能帮我了解一下record的默认equals和hashcode实现的行为与上面有什么不同吗?
如果equals和hashcode实现中有更改,则进行记录。那么请帮助我理解这个变化的确切目的是什么,以及在哪些情况下使用它会更有帮助。
提前感谢!!
简而言之,区别很简单:
java.lang.object
的
equals()
和
hashcode()
的默认实现不会将两个对象视为
equal
,除非它们是同一个对象(即“对象标识”,即
x==y
)。
equals()
和hashcode()
的默认实现将考虑所有组件(或字段)并比较它们的相等性(或考虑它们用于哈希代码)。如果它们都匹配,那么.equals()
将返回true
,hashcode
将返回相同的值。java.lang.object
的详细文档包括:
问题内容: 我试图理解Java对象的hashCode(),并看到Java对象的hashCode()方法的以下代码: 因此,该类即:将隐式扩展该类。 主班: 正如隐式扩展类一样,因此它将具有类的方法。 我调用了on 对象,但由于尚未覆盖on ,因此从理论上讲它应该调用class的。 我的疑问是: 由于Object类没有任何实现,因此如何计算任何对象的哈希码? 就我而言,当我运行该程序时,它返回的哈希
问题内容: 鉴于这种: 输出为: 这是为每个对象提供false,但每个String对象的哈希码都相同。为什么会这样呢? 问题答案: 确实比较 对象的 真实相等性(我的意思是-两个引用都指向同一个对象),而不是它们的内容,而比较内容(至少对于String)。 并指向不同的对象。 还要注意,如果对象相等,则它们的哈希必须相同,但是如果哈希码相同,则并不意味着对象相等。
问题内容: Bert Bates和Kathy Sierra的SCJP 6学习指南在第554页中指出(除其他要求外) x.hashCode()!= y.hashCode()要求x.equals(y)== false 。 但是Javadoc for Object并未明确提及此类要求。Quote: 如果根据equals(Object)方法,两个对象相等,则在两个对象中的每个对象上调用hashCode方法
假设以下示例:
问题内容: 说我有自己的课程 它具有一些属性和方法。它不实现等于,不实现hashCode。 一旦我们调用equals和hashCode,默认的实现是什么?从对象类?那是什么 默认值等于如何工作?默认的hashCode将如何工作,返回什么?==只会检查它们是否引用同一个对象,因此很容易,但是equals()和hashCode()方法呢? 问题答案: 是的,默认实现是Object的实现(通常来说;如果
问题内容: 如果没有覆盖该方法,默认的实现是什么? 问题答案: 然后,此类从其祖先之一继承。如果它们都不覆盖它,则使用Object.hashCode。 从文档: 在合理可行的范围内,由Object类定义的hashCode方法确实为不同的对象返回不同的整数。(通常通过将对象的内部地址转换为整数来实现,但是JavaTM编程语言不需要此实现技术。) 因此默认实现是特定于JVM的