1

以下は私が書いた大きなライブラリの一部なので、小さなコードだけを示しています。さらに必要な場合は、お知らせください。

ベジェのアンカーを選択できるツールを作成しています。奇妙なことに、たとえばアンカーを1つ選択します。次に、Shiftキーを押しながらトグル選択を行うことができます。ここで、選択されていないアンカーが選択され、選択されているアンカーが選択解除されます。同じアンカーを選択します。次に、コードの最初の行で、それがArrayListlastAnchorSelectionにあるかどうかを確認します。それは一部でしたが、何らかの理由で継続しています。次に、最後の選択のサイズである1を報告します。次に、arrayListからオブジェクトを取得し、vに対してテストすると、trueが出力されます。

では、最初の行がfalseになり、4番目の行がtrueになるのはどうしてですか?

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を参照)に従うことになっています。最初のルールは次のとおりです。

  • これは再帰的です。null以外の参照値xの場合、x.equals(x)はを返す必要がありtrueます。

しかし、のクラスには、このルールvに違反する非準拠の実装があるようです。equals()

それまたはそれはスレッドの問題であり、他のスレッドがテストとのv間にリストに追加されています。contains()get(0)

于 2012-12-20T11:25:44.810 に答える
2

最初の行はequals()比較に使用し、2番目の行は参照を比較します。

于 2012-12-20T11:25:18.463 に答える
0

ArrayListから

このリストに指定された要素が含まれている場合はtrueを返します。より正式には、このリストに(o == null?e == null:o.equals(e))のような要素eが少なくとも1つ含まれている場合にのみ、trueを返します。

あなたの場合、これはになりますv.equals(test)。これがfalseをcontains(v)返す場合、falseも返します。

4行目v == testはを比較します。これは。とは異なる比較ですv.equals(test)

v == testとの参照を比較しvますtest。同じオブジェクトvを参照する場合、これはtrueを返します。test一方v.equals(test)、メソッドを呼び出すと、equals実装によっては何でも(falseでも)返される可能性があります。

于 2012-12-20T11:30:42.807 に答える