无法从HashSet中删除自定义对象

时间:2013-09-16 08:21:47

标签: java equals hashcode hashset removeall

为什么removeAll(Collection<?> a)在未删除集合中的对象时返回true?我覆盖了我的自定义对象的hashcode和equals方法。 输入中Object的哈希码与选择内对象的哈希码相同。

 private void onRemove(IStructuredSelection selection) {
            boolean removeAll = getInput().removeAll(selection.toList()); // returns true
            Set<ReadingNodeCfg> input = getInput(); // Object from selection is still there
    }

输入中的对象与选择中的对象相同,那么为什么不删除它呢?

祝你好运

edit1 :我通过eclipse生成了equals和hashcode,getInput()返回HashSet<ReadingNodeCfg>,selection.toList()返回List<ReadingNodeCfg>

edit2

   for (Object object : selection.toList()) {
        boolean remove = getInput().remove(object); // returns false
        int hashCode = object.hashCode(); // returns 1130504316
        int hashCode2 = getInput().iterator().next().hashCode(); // returns 1130504316
        boolean equals = object.equals(getInput().iterator().next()); // returns true

    }

edit3 :我现在正在使用IObservableList。现在工作正常!

修改后输入中的哈希码发生了变化。我想要删除的对象与修改后的输入对象具有相同的哈希码,但无论如何它没有用,我仍然不确定原因。

SOLUTION:

我现在解决了这个问题。我为其他遇到同样问题的人创建了一个例子。

@Test
    public void derp() {
        Person person = new Person();
        person.name = "jay";

        Set<Person> humans = new HashSet<>();
        humans.add(person);

        person.name = "fred";
        assertTrue(!humans.remove(person));
    }

修改后无法移除此person对象。 hashset无法找到对象person的哈希码本身。

  1. person的哈希码:1337
  2. 将其添加到Hashcode将创建类似此哈希码与对象之间的引用
  3. 更改人名会更改哈希码:1338
  4. 从哈希码中删除此对象将尝试使用哈希码1337删除该对象,该对象不起作用
  5. 如果您不重写quals / hashcode,则可以毫无问题地删除此项
  6. 祝你好运

2 个答案:

答案 0 :(得分:1)

  

为什么removeAll(Collection a)在未删除集合中的对象时返回true?

只有在修改集合时才返回true。如果您的收藏品未被修改,则表示您正在查找错误的收藏集。我建议将任务传递给调用者,而不是修改getter的结果(这是不好的做法)。 e.g。

boolean removeAll = removeAllFromInput(selection.toList()); // returns true

我敢打赌getInput()会收集该集合的防御副本,以避免您错误地尝试更改它。

答案 1 :(得分:0)

解决方案:

我现在解决了这个问题。我为其他遇到同样问题的人创建了一个例子。

@Test
    public void derp() {
        Person person = new Person();
        person.name = "jay";

        Set<Person> humans = new HashSet<>();
        humans.add(person);

        person.name = "fred";
        assertTrue(!humans.remove(person));
    }

修改后无法删除此人物。 hashset无法找到对象person的哈希码。

  1. 人的哈希码:1337
  2. 将其添加到Hashcode将创建 类似于这个哈希码和对象之间的引用
  3. 更改人名会更改哈希码:1338
  4. 从哈希码中删除此对象将尝试删除该对象 使用哈希码1337,无法正常工作
  5. 如果你不重写equals / hashcode,你将能够删除此项目 问题
  6. 祝你好运