【问题标题】: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 可能不像您想要的那样起作用。

    【讨论】:

    • 别忘了重写 hashCode()
    【解决方案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 中使用对象时可能会导致奇怪的行为。

      【讨论】:

        猜你喜欢
        • 2022-08-15
        • 2016-07-30
        • 1970-01-01
        • 2011-02-17
        • 2023-04-03
        • 1970-01-01
        • 2010-12-05
        相关资源
        最近更新 更多