ConcurrentSkipListSetを使用し、containsメソッドを使用しています。以下のためのJAVAドキュメントを1としてConcurrentSkipListSet.containsにはコンパレータが必要であり、等しくない理由
は、このセットは、指定された要素が含まれている場合の方法
はtrueを返します。正式には、このセットにo.equals(e)などの要素eが含まれている場合にのみtrueを返します。
私のテストでは、equalsメソッドは使用されていませんが、Comparatorは必須です。 ClassCastExceptionが発生することがあり匹敵するようComparableUsingComparatorを返し、私は
ConcurrentSkipListSetの
/** *コンパレータを使用している場合をJAVAの仕様と実装の間のこの異常を理解してください、それ以外の *キャストキー、 *呼び出し元に伝播されます。 */ プライベート匹敵する同等の(オブジェクトキー)java.util.concurrent.ConcurrentSkipListMap.comparable(ConcurrentSkipListMap.java:663)java.util.concurrent.ConcurrentSkipListMap.doGetで (ConcurrentSkipListMap.java:821)で
java.util.concurrent.ConcurrentSkipListMap.containsKeyで (ConcurrentSkipListMap.java:1608)
私はOracleのJDK 7
これは、ソートされたコレクションの正常な動作です。 「TreeSet」のドキュメントは、おそらく適用可能です:「セットによって維持される順序(明示的コンパレータが提供されているかどうかにかかわらず)は、Setインタフェースを正しく実装するためにはequalsと一貫していなければなりません(ComparableまたはComparator for ) –
CSLS用のJavaドキュメントは太字でこれを明確にしていたはずです。 –
@Louis Wasserman:['TreeSet.contains'](https://docs.oracle.com/javase/8/docs/api/java/util/TreeSet.html#contains-java.lang.Object-)に注意してください。そのドキュメントにも同じ誤解を招く文があり、明らかにJava 6で意図的に追加されています。 – Holger