问题描述
我在一篇文章中读到 java contains 方法使用 indexOf 方法,该方法内部使用 equals 方法检查对象是否存在于字符串中。
所以我有一个代码并且我没有覆盖 Employee 类的 equals 方法。
Employee employee = new Employee(1,"John");
Employee employee2 = new Employee(1,"akshay");
Employee employee3 = new Employee(1,"akshay");
List<Employee> employeeList = new ArrayList<>();
employeeList.add(employee3);
employeeList.add(employee);
System.out.println(employeeList.contains(employee)); // returns true
System.out.println(employee3.equals(employee2)); // returns false
System.out.println(employeeList.contains(new Employee(1,"akshay"))); // returns false
如果 contains 方法在内部使用 equals 方法,为什么会返回 true? 由于 equals 方法默认检查引用相等性,contains 方法如何确定对象是否存在?
解决方法
如果 contains 方法在内部使用 equals 方法,为什么会返回 true?
当两个对象引用同一个对象时,equals
的默认行为将返回 true。这就是您的代码中发生的事情。
Employee employee = new Employee(1,"John");
....
List<Employee> employeeList = new ArrayList<>();
employeeList.add(employee);
....
System.out.println(employeeList.contains(employee));
最后一行遍历列表中的每个 Employee 并对其调用 equals。当它遇到 John 时,就像检查 employee.equals(employee)
是否为 true。
对于返回 true 的最后两次调用,您必须覆盖 equals 和 hashCode 方法。