【问题标题】:Is there an easy way to remove the same object from 2 linked lists?有没有一种简单的方法可以从 2 个链表中删除同一个对象?
【发布时间】:2010-11-02 15:38:47
【问题描述】:
我有 2 个链表。
我在这两个列表中都有相同的对象。同一个对象是指该对象具有相同的状态,但被不同的对象指针引用。
我可以从第一个列表中调用.remove(object); 来删除它,但是如果我对第二个列表执行相同操作,它不会被删除(因为对象指针引用不同)
有没有一种简单的方法可以从各种列表中删除具有相同状态的对象?
考虑一下,我可能会遍历第二个列表比较对象的状态,但我正在寻找一种更简洁的方法
【问题讨论】:
标签:
java
linked-list
object-state
【解决方案1】:
覆盖对象的equals方法。如果它们具有相似的等效功能,则应从两个列表中正确删除它们。
编辑 - 为了正确起见:
在重写 equals 方法时,您应该始终重写 hashCode 方法。不这样做可能不会在您的 List 中显示任何奇怪的功能,但是一旦您尝试在 HashMap 中使用相同的对象,您可能会发现 remove 或 put 可能不像您想要的那样起作用。
【解决方案2】:
如果对象具有相同的状态,那么覆盖它们的 equals 和 hashCode 方法以反映这一点可能是正确的。如果就 equals 方法而言对象相同,那么您可以在两个列表上调用 remove。
如果链表实现得当,内存中指向不同对象的事实不应该阻止它工作。根据List API,remove方法:
...删除具有最低索引的元素 i 使得 (o==null ? get(i)==null : o.equals(get(i))) (如果存在这样的元素)...
【解决方案3】:
您必须在您的对象上同时覆盖 equals() 和 hashCode()。当这些未被覆盖时,默认行为是比较对象身份,即引用。当您覆盖 Equals 时,您可以将比较更改为基于对象状态,即逻辑上的相等。记住要覆盖 hashCode 也很重要,因为如果不这样做,当您在 HashSet 或 HashTable 中使用对象时可能会导致奇怪的行为。