为什么 TreeSet 的 add 方法在不同的 JRE 中表现不同?
Why does TreeSet's add method behaves differently in different JREs?
我尝试将 Employee class 的对象添加到 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() 方法。它总是在运行时抛出 ClassCastException。
但是说到这个问题- Why does TreeSet throws ClassCastException
那里的用户写道,当他只使用一次添加方法时他没有得到异常。
另外,在另一个系统(Win 7)中,我昨天试了3次添加对象,调用了三次set方法,都没有出现ClassCastException!! set 的大小仍然只有 1,所以看起来多个对象只是没有被添加到 set 中。
那么 add 方法的不同行为的原因可能是什么?
TreeSet.add()
委托给 TreeMap.put()
,它在 Java 6 和 Java 8 中具有不同的行为。
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()
行注释掉了,但在较新的版本中将其添加了回来。因此,您看到的第一个元素异常。
另见此处:Why TreeSet can be used as a key for TreeMap in jdk 1.6?
我尝试将 Employee class 的对象添加到 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() 方法。它总是在运行时抛出 ClassCastException。 但是说到这个问题- Why does TreeSet throws ClassCastException 那里的用户写道,当他只使用一次添加方法时他没有得到异常。
另外,在另一个系统(Win 7)中,我昨天试了3次添加对象,调用了三次set方法,都没有出现ClassCastException!! set 的大小仍然只有 1,所以看起来多个对象只是没有被添加到 set 中。
那么 add 方法的不同行为的原因可能是什么?
TreeSet.add()
委托给 TreeMap.put()
,它在 Java 6 和 Java 8 中具有不同的行为。
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()
行注释掉了,但在较新的版本中将其添加了回来。因此,您看到的第一个元素异常。
另见此处:Why TreeSet can be used as a key for TreeMap in jdk 1.6?