2

我有 2 个链接列表。

我在这两个列表中都有相同的对象。通过相同的对象,我的意思是对象具有相同的状态,但被不同的对象指针引用。

我可以.remove(object);从第一个列表中调用以删除它,但如果我对第二个列表执行相同操作,它不会被删除(因为对象指针引用不同)

有没有一种简单的方法可以从各种列表中删除具有相同状态的对象?

考虑一下,我可能会遍历第二个列表比较其对象的状态,但我正在寻找一种更清洁的方法

4

3 回答 3

3

覆盖对象的 equals 方法。如果它们具有类似的等效功能,则应从两个列表中正确删除它们。

编辑 - 为了正确起见:

在覆盖 equals 方法时,您应该始终覆盖 hashCode 方法。不这样做可能不会在您的 List 中显示任何奇怪的功能,但是一旦您尝试在 HashMap 中使用相同的对象,您可能会发现 remove 或 put 可能不像您想要的那样起作用。

于 2010-11-02T15:39:59.767 回答
0

如果对象具有相同的状态,那么覆盖它们的 equals 和 hashCode 方法以反映这一点可能是正确的。如果就 equals 方法而言对象相同,那么您可以在两个列表上调用 remove。

如果链表实现得当,内存中指向不同对象的事实不应该阻止它工作。根据List API, remove 方法:

...删除具有最低索引的元素 i 使得 (o==null ? get(i)==null : o.equals(get(i))) (如果存在这样的元素)...

于 2010-11-02T15:46:46.937 回答
0

您必须同时覆盖equals()hashCode()您的对象。当这些未被覆盖时,默认行为是比较对象身份,即引用。当您覆盖 Equals 时,您可以将比较更改为基于对象状态,即逻辑相等。记住重写 hashCode 也很重要,因为如果没有这样做,当您在 HashSet 或 HashTable 中使用对象时,可能会导致奇怪的行为。

于 2010-11-02T15:53:08.310 回答