EmployeeクラスのオブジェクトをTreeSetに追加しようとしています。ComparableまたはComparatorインターフェースを実装していません。ただし、addメソッドコードはシステムによって動作が異なります。なぜそうなのか?以下のコードスニペット:-
import java.util.Set;
import java.util.TreeSet;
public class TreeSetTest {
public static void main(String[] args) {
Set<Employee> set = new TreeSet<Employee>();
set.add(new Employee());
// set.add(new Employee());
// set.add(new Employee());
}
}
現在のシステム(Win 10)では、set.add()メソッドを1回作成するか3回作成するか。実行時に常にClassCastExceptionをスローします。しかし、この質問について話すと、TreeSetがClassCastExceptionをスローするのはなぜですか。そこにあるユーザーは、addメソッドを1回だけ使用しても例外が発生しないと書いています。
また、別のシステム(Win 7)では、昨日、オブジェクトを3回追加し、setメソッドを3回呼び出してみましたが、ClassCastExceptionはありません!! セットのサイズは1のままなので、複数のオブジェクトがセットに追加されていないように見えました。
では、addメソッドの動作が異なる-異なる種類の理由は何でしょうか?
TreeSet.add()
に委任しますTreeMap.put()
。これは、Java6とJava8で動作が異なります。
public V put(K key, V value) {
Entry<K,V> t = root;
if (t == null) {
// TBD:
// 5045147: (coll) Adding null to an empty TreeSet should
// throw NullPointerException
//
// compare(key, key); // type check
root = new Entry<K,V>(key, value, null);
size = 1;
modCount++;
return null;
}
...
public V put(K key, V value) {
Entry<K,V> t = root;
if (t == null) {
compare(key, key); // type (and possibly null) check
root = new Entry<>(key, value, null);
size = 1;
modCount++;
return null;
}
...
ご覧のとおり、以前のバージョンではcompare()
何らかの理由で行がコメントアウトされていましたが、後のバージョンで追加されました。したがって、最初の要素に表示される例外。
こちらもご覧ください:TreeSetをjdk 1.6のTreeMapのキーとして使用できるのはなぜですか?
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加