TreeSetのaddメソッドが異なるJREで異なる動作をするのはなぜですか?

シャンティ

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メソッドの動作が異なる-異なる種類の理由は何でしょうか?

shmosel

TreeSet.add()に委任しますTreeMap.put()。これは、Java6とJava8で動作が異なります。

Java 6

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;
    }
    ...

Java 8

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]

編集
0

コメントを追加

0

関連記事

分類Dev

setattrが属性とメソッドで異なる動作をするのはなぜですか?

分類Dev

Python-findメソッドとindexメソッドの動作が異なるのはなぜですか?

分類Dev

`Paths.get`メソッドの動作が異なるのはなぜですか?

分類Dev

matplotlibのAxes3D.plot()メソッドと.scatter()メソッドへの入力を変更すると、動作が異なるのはなぜですか?

分類Dev

実行メソッド本体が異なると、スレッドの動作が異なるのはなぜですか?

分類Dev

実行メソッド本体が異なると、スレッドの動作が異なるのはなぜですか?

分類Dev

このコードが異なる値で異なる動作をするのはなぜですか

分類Dev

両方が参照型である場合、メソッドに文字列を渡すとList <object>とは異なる動作をするのはなぜですか?

分類Dev

@propertyメソッドを使用すると、hasattrがクラスとインスタンスで異なる動作をするのはなぜですか?

分類Dev

VIM:ドット演算子の動作が異なるのはなぜですか?

分類Dev

プライベートセッターが他のプライベートメソッドとは異なる動作をするのはなぜですか?

分類Dev

インスタンスのクラスのextendメソッドが継承とは異なる動作をするのはなぜですか?

分類Dev

リストと文字列のメソッドがPythonで異なる動作をするのはなぜですか

分類Dev

jQueryのon / offメソッドが外部スクリプトと異なる動作をするのはなぜですか

分類Dev

NameValueCollectionの動作が異なるのはなぜですか?

分類Dev

groupby操作の動作が異なるのはなぜですか

分類Dev

`fxLayoutAlign`の動作が異なるのはなぜですか?

分類Dev

hide()の動作が異なるのはなぜですか?

分類Dev

to_symの動作が異なるのはなぜですか?

分類Dev

memsetが関数で異なる動作をするのはなぜですか?

分類Dev

jQueryがjavascriptとは異なる動作をするのはなぜですか?

分類Dev

ghciがrunHaskellとは異なる動作をするのはなぜですか?

分類Dev

ArrayListのaddメソッドで戻り値の型が異なるのはなぜですか?

分類Dev

SetSystemTime()が午後に異なる動作をするのはなぜですか?

分類Dev

Dispatch_group_notifyが異なる環境で異なる動作をするのはなぜですか?

分類Dev

異なる方法で文字列を変更すると、動作が異なるのはなぜですか?

分類Dev

同じコードの動作が異なるのはなぜですか?

分類Dev

異なるセットの合成方法で同じコードが異なる動作をするのはなぜですか?

分類Dev

このargparseコードがPython2と3で異なる動作をするのはなぜですか?

Related 関連記事

  1. 1

    setattrが属性とメソッドで異なる動作をするのはなぜですか?

  2. 2

    Python-findメソッドとindexメソッドの動作が異なるのはなぜですか?

  3. 3

    `Paths.get`メソッドの動作が異なるのはなぜですか?

  4. 4

    matplotlibのAxes3D.plot()メソッドと.scatter()メソッドへの入力を変更すると、動作が異なるのはなぜですか?

  5. 5

    実行メソッド本体が異なると、スレッドの動作が異なるのはなぜですか?

  6. 6

    実行メソッド本体が異なると、スレッドの動作が異なるのはなぜですか?

  7. 7

    このコードが異なる値で異なる動作をするのはなぜですか

  8. 8

    両方が参照型である場合、メソッドに文字列を渡すとList <object>とは異なる動作をするのはなぜですか?

  9. 9

    @propertyメソッドを使用すると、hasattrがクラスとインスタンスで異なる動作をするのはなぜですか?

  10. 10

    VIM:ドット演算子の動作が異なるのはなぜですか?

  11. 11

    プライベートセッターが他のプライベートメソッドとは異なる動作をするのはなぜですか?

  12. 12

    インスタンスのクラスのextendメソッドが継承とは異なる動作をするのはなぜですか?

  13. 13

    リストと文字列のメソッドがPythonで異なる動作をするのはなぜですか

  14. 14

    jQueryのon / offメソッドが外部スクリプトと異なる動作をするのはなぜですか

  15. 15

    NameValueCollectionの動作が異なるのはなぜですか?

  16. 16

    groupby操作の動作が異なるのはなぜですか

  17. 17

    `fxLayoutAlign`の動作が異なるのはなぜですか?

  18. 18

    hide()の動作が異なるのはなぜですか?

  19. 19

    to_symの動作が異なるのはなぜですか?

  20. 20

    memsetが関数で異なる動作をするのはなぜですか?

  21. 21

    jQueryがjavascriptとは異なる動作をするのはなぜですか?

  22. 22

    ghciがrunHaskellとは異なる動作をするのはなぜですか?

  23. 23

    ArrayListのaddメソッドで戻り値の型が異なるのはなぜですか?

  24. 24

    SetSystemTime()が午後に異なる動作をするのはなぜですか?

  25. 25

    Dispatch_group_notifyが異なる環境で異なる動作をするのはなぜですか?

  26. 26

    異なる方法で文字列を変更すると、動作が異なるのはなぜですか?

  27. 27

    同じコードの動作が異なるのはなぜですか?

  28. 28

    異なるセットの合成方法で同じコードが異なる動作をするのはなぜですか?

  29. 29

    このargparseコードがPython2と3で異なる動作をするのはなぜですか?

ホットタグ

アーカイブ