包含ArrayList失败

时间:2012-12-20 11:23:09

标签: java contains

以下是我写的大型库的一部分所以我只展示了一小段代码。如果需要更多,请告诉我。

我正在制作一个工具,我可以选择贝塞尔的锚点。 奇怪的是,我选择一个锚例如。 然后我可以按住切换选择切换选择,其中未选择的锚点被选中,选定的锚点被取消选择。 我选择了相同的锚。 然后在第一行代码中检查它是否在ArrayList lastAnchorSelection中。 这是一部分但由于某种原因它继续。 然后它报告最后一个选择的大小,即1。 然后我从arrayList中获取对象并对v进行测试,它打印出true。

那么第一行如何导致false,第四行导致为真?

if (lastAnchorSelection.contains(v) == false) {
  System.out.println("lastAnchorSelection.size(): "+lastAnchorSelection.size());
  CVector test = lastAnchorSelection.get(0);
  System.out.println(test == v);
  System.out.println("C");

3 个答案:

答案 0 :(得分:4)

Collection.contains是根据equals()方法指定的。 equals()的实现应该遵循许多规则(参见Object类javadoc),第一个是

  • 反身:对于任何非空引用值xx.equals(x)应返回true

但看起来v的类具有违反此规则的不合规equals()实现。

要么是这个问题,要么是线程问题,而其他一些线程正在v测试与contains()之间的列表中添加get(0)

答案 1 :(得分:2)

第一行使用equals()进行比较,第二行比较参考。

答案 2 :(得分:0)

来自ArrayList

  

如果此列表包含指定的元素,则返回true。更正式地说,当且仅当此列表包含至少一个元素e时才返回true(o == null?e == null:o.equals(e))。

在您的情况下,这将是v.equals(test)。当返回false时,contains(v)也会返回false。

第4行比较v == test,这是与v.equals(test)不同的比较。

v == test会比较vtest的引用。当vtest引用同一个对象时,返回true。而v.equals(test)调用方法equals,它可能会返回任何内容(甚至是假的),具体取决于它的实现。