以下是我写的大型库的一部分所以我只展示了一小段代码。如果需要更多,请告诉我。
我正在制作一个工具,我可以选择贝塞尔的锚点。 奇怪的是,我选择一个锚例如。 然后我可以按住切换选择切换选择,其中未选择的锚点被选中,选定的锚点被取消选择。 我选择了相同的锚。 然后在第一行代码中检查它是否在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");
答案 0 :(得分:4)
Collection.contains
是根据equals()
方法指定的。 equals()
的实现应该遵循许多规则(参见Object类javadoc),第一个是
x
,x.equals(x)
应返回true
。但看起来v
的类具有违反此规则的不合规equals()
实现。
要么是这个问题,要么是线程问题,而其他一些线程正在v
测试与contains()
之间的列表中添加get(0)
。
答案 1 :(得分:2)
第一行使用equals()
进行比较,第二行比较参考。
答案 2 :(得分:0)
如果此列表包含指定的元素,则返回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
会比较v
和test
的引用。当v
和test
引用同一个对象时,返回true。而v.equals(test)
调用方法equals
,它可能会返回任何内容(甚至是假的),具体取决于它的实现。