Java 链表.contains 方法
Java Linked List .contains method
我有一个包含 A 类型元素的 LinkedList。
我需要根据某些条件检查列表是否包含元素。
重写classA中的.equals方法是否足够,还是我还需要重写hash方法?
您不必覆盖 hashCode,但相同的对象应该具有相同的 hashcode。我的建议:如果您使用 eclipse,请右键单击 class,转到源代码,生成 equals() 和 hashcode(),以及 select 必须相等的变量。这是最简单的方法。
当您的对象将用于使用散列的数据结构时,您需要覆盖 hashCode() 方法。 HashMap、HashSet等
没有人说您必须实现 hashCode() 函数。许多数据结构只使用 equals() 方法,而不使用 hashCode() 函数,所以你可以不用实现它。
但是你不能真正保证没有人会把它放入另一个使用 hashCode() 函数的数据结构中,所以从一开始就实现它可能是一个好习惯。
equals()
方法应该只用于判断对象的身份。
如果用于查找您要查找的对象的条件与用于定义对象身份的条件完全匹配,那么调用 List
的 contains()
方法就可以了,该方法依赖于 equals()
.
在任何其他情况下,您应该遍历列表并执行手动比较。或者,您可以使用 Java8 Streams,它提供过滤功能。
您必须意识到,通过实施 equals
方法,您定义了一个 等价 关系,即细分此 [=28= 的所有对象的关系] 等价 classes。当有许多对象满足您的条件时,它们都将被视为相等,并且它们都必须具有相同的 hashCode。因此,当您在某个时候将这些对象放入 HashMap 中时,所有这些对象最终都会位于同一个槽中,从而导致退化的 HashMap 性能不佳。
即使您不打算将对象放在 HashMap 中,这似乎也是反对实施 equals
以根据更广泛的标准进行比较的有力论据。
你必须确保你的实现满足等价联系,即它必须是自反的、对称的和可传递的。 Joshua Bloch 的标准书《Effective Java》有详细的解释。
你 必须 实现 hashCode
每当你实现 equals
,因为每两个相等的对象必须有相同的散列码(见 this post 以获得详细解释)。
我有一个包含 A 类型元素的 LinkedList。 我需要根据某些条件检查列表是否包含元素。
重写classA中的.equals方法是否足够,还是我还需要重写hash方法?
您不必覆盖 hashCode,但相同的对象应该具有相同的 hashcode。我的建议:如果您使用 eclipse,请右键单击 class,转到源代码,生成 equals() 和 hashcode(),以及 select 必须相等的变量。这是最简单的方法。
当您的对象将用于使用散列的数据结构时,您需要覆盖 hashCode() 方法。 HashMap、HashSet等
没有人说您必须实现 hashCode() 函数。许多数据结构只使用 equals() 方法,而不使用 hashCode() 函数,所以你可以不用实现它。
但是你不能真正保证没有人会把它放入另一个使用 hashCode() 函数的数据结构中,所以从一开始就实现它可能是一个好习惯。
equals()
方法应该只用于判断对象的身份。
如果用于查找您要查找的对象的条件与用于定义对象身份的条件完全匹配,那么调用 List
的 contains()
方法就可以了,该方法依赖于 equals()
.
在任何其他情况下,您应该遍历列表并执行手动比较。或者,您可以使用 Java8 Streams,它提供过滤功能。
您必须意识到,通过实施 equals
方法,您定义了一个 等价 关系,即细分此 [=28= 的所有对象的关系] 等价 classes。当有许多对象满足您的条件时,它们都将被视为相等,并且它们都必须具有相同的 hashCode。因此,当您在某个时候将这些对象放入 HashMap 中时,所有这些对象最终都会位于同一个槽中,从而导致退化的 HashMap 性能不佳。
即使您不打算将对象放在 HashMap 中,这似乎也是反对实施 equals
以根据更广泛的标准进行比较的有力论据。
你必须确保你的实现满足等价联系,即它必须是自反的、对称的和可传递的。 Joshua Bloch 的标准书《Effective Java》有详细的解释。
你 必须 实现 hashCode
每当你实现 equals
,因为每两个相等的对象必须有相同的散列码(见 this post 以获得详细解释)。