2016-06-17 16 views
0

我嘗試將Employee類的對象添加到TreeSet。我沒有實現Comparable或Comparator接口。但是添加方法代碼在不同的系統中表現不同。爲什麼這樣?下面的代碼片段: - 我爲什麼TreeSet的add方法在不同的JRE中表現不同?

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()); 
} 
} 

當前系統(10場),無論是寫set.add()方法一次或三次。它總是在運行時拋出ClassCastException。 但是這個問題的談話 - Why does TreeSet throws ClassCastException 用戶在那裏寫道,他沒有得到例外時,他只使用添加方法一次。另外,在另一個系統(Win 7)中,昨天我嘗試添加對象3次,調用set方法三次,並且沒有ClassCastException! set的大小隻有1,所以看起來好像多個對象沒有被添加到set中。

那麼,add方法的不同種類的行爲可能是什麼原因呢?

+1

如果有的話,這將是JRE版本,而不是Windows版本。 – shmosel

+0

@shmosel是的,所以我猜不同的窗口版本也會有不同的JRE。 – shanti

+0

他們可能或不可以。你爲什麼不檢查? – shmosel

回答

4

TreeSet.add()委託給TreeMap.put(),這在Java 6中和Java 8.不同行爲

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()線由於某種原因被註釋掉了,但它在後面的版本中被添加了回來。因此,你看到的第一個元素是個例外。

看到這裏也:Why TreeSet can be used as a key for TreeMap in jdk 1.6?

+0

有趣。感謝那。讓我閱讀這些類的實現細節,以更清晰。 – shanti

+0

非常感謝這個答案。我快速查看了TreeMap類的實現,並且您完全正確。在Java 6中,比較方法是註釋的,但在Java 7和8中沒有註釋。所以它會在Java 7和8中拋出ClassCastException,但不會在6中拋出ClassCastException。 – shanti

相關問題