1

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

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

那么第一行如何导致错误,而第四行结果为真呢?

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");
4

3 回答 3

4

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

  • 它是自反的:对于任何非空引用值xx.equals(x)都应该返回true

但看起来 的类v有一个违反此规则的不兼容equals()实现。

要么是线程问题,要么是线程问题,并且其他一些线程正在添加vcontains()test 和get(0).

于 2012-12-20T11:25:44.810 回答
2

第一行用于equals()比较,第二行用于比较引用。

于 2012-12-20T11:25:18.463 回答
0

来自ArrayList

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

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

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

v == test比较 和 的v引用test。当vtest引用同一个对象时, this 返回 true。而v.equals(test)调用方法equals,它可能会根据其实现返回任何东西(甚至是错误的)。

于 2012-12-20T11:30:42.807 回答