gpt4 book ai didi

java - 为什么对象列表的 Equals 和 Hashcode 相同,即使我尚未为该对象实现这些方法

转载 作者:行者123 更新时间:2023-12-04 10:28:15 24 4
gpt4 key购买 nike

我有3节课

员工类就像

  class Employee {
int id;
String name;
long salary;
List<Address> address;
//getter setter, equals and hashcode and parameterized constructor}

我的地址类就像
public class Address {
int housenum;
String streetname;
int pincode;
//getter setter and parameterized constructor
}

我的测试课就像
 Address address1 = new Address(10, "str 1", 400043);
Address address2 = new Address(10, "str 1", 400043);

List<Address> addressLst1= new ArrayList<>();
List<Address> addressLst2= new ArrayList<>();
addressLst1.add(address1);
addressLst1.add(address2);
addressLst2.add(address1);
addressLst2.add(address2);
Employee employee1 = new Employee(1, "EMP1", 1000, addressLst1);
Employee employee2 = new Employee(1, "EMP1", 1000, addressLst2);

Set<Employee> set = new HashSet<>();
set.add(employee1);
set.add(employee2);

System.out.println(":::::::::::::::addressLst1:::::::::" + addressLst1.hashCode());
System.out.println(":::::::::::::::addressLst2:::::::::" + addressLst2.hashCode());

System.out.println(":::::::::::::::address1:::::::::" + address1.hashCode());
System.out.println(":::::::::::::::address2:::::::::" + address2.hashCode());

System.out.println(":::::::::::::::employee1:::::::::" + employee1.hashCode());
System.out.println(":::::::::::::::employee2:::::::::" + employee2.hashCode());

set.forEach(System.out::println);

System.out.println(":::::::::::::::size:::::::::" + set.size());

我为地址对象获取了不同的哈希码,因为我没有覆盖等于和哈希码。但是为什么我为两个不同的地址列表获得相同的哈希码,即 addressLst1 和 addressLst2 为什么我将 set 的大小设置为 1,为什么两个员工对象的哈希码相同?覆盖包含另一个自定义对象列表的自定义对象的等于和哈希码的正确方法是什么?

最佳答案

两人List s addressLst1addressLst2以完全相同的顺序包含完全相同的元素,所以 List 的合约的 equals要求这两个List s 将彼此相等:

boolean java.util.List.equals(Object o)

Compares the specified object with this list for equality. Returns true if and only if the specified object is also a list, both lists have the same size, and all corresponding pairs of elements in the two lists are equal. (Two elements e1 and e2 are equal if (e1==null ? e2==null :e1.equals(e2)).) In other words, two lists are defined to be equal if they contain the same elements in the same order. This definition ensures that the equals method works properly across different implementations of the List interface.


没关系 Address不会覆盖 equalshashCode , 自 List s 包含对相同对象的引用。虽然 address1不等于 address2 , 两者 List s 包含对 address1 的引用和 address2以相同的顺序,所以 List s 相等。
对于 Employee类(class),您写道您确实覆盖了 equalshashCode ,所以我假设两个 Employees如果它们的所有属性都相等,则它们相等。因此两个 Employee您尝试添加到 Set 的实例是平等的。

关于java - 为什么对象列表的 Equals 和 Hashcode 相同,即使我尚未为该对象实现这些方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60539303/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com