Java中的HashSet和TreeSet

时间:2013-08-23 09:15:24

标签: java collections

Set s = new HashSet();

boolean b[] = new boolean[5];
b[0] = s.add("a");
b[1] = s.add(new Integer(5));
b[2]= s.add("a");
b[3] = s.add(new Object());
b[4] = s.add("4");
for(int i=0;i<b.length;i++){
    System.out.println(b[i]);
}

这正是按预期给出了这个输出: -

true
true
false
true
true

但是当我使用Treeset时

Set s = new TreeSet();

它给了我这个例外。

Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at java.lang.Integer.compareTo(Unknown Source)
at java.util.TreeMap.put(Unknown Source)
at java.util.TreeSet.add(Unknown Source)
at com.sunil.questions.TreeSetExample.main(TreeSetExample.java:15)

我想知道为什么它会向我展示这种行为。

4 个答案:

答案 0 :(得分:6)

  • TreeSet已排序,无法将StringInteger排在一起。 这就是你得到这个例外的原因。

如果您只是添加相同类型的元素,那么您将不会获得异常。

这是仿制品的图片,如果您希望您的馆藏是类型安全的,那么您可以将它们声明为Set<String> set = new HashSet<String>()Set<Integer> set = new TreeSet<Integer>();

使用此方法,编译器本身将阻止您将整数添加到Set<String>,同样如此。

答案 1 :(得分:3)

邪恶的根源不是使用泛型。您正在实例化一组未知对象,并希望Java能够正常使用它们。不幸的是,这次它不能 - 将StringInteger进行比较是不可能的,至少在默认情况下不是这样。

使用Set<String> s = new HashSet<String>();Set<String> s = new TreeSet<String>();。然后,编译器会告诉您无法将Integer添加到集合中,您将被迫将Integer转换为String,并且一切都会正常运行。

答案 2 :(得分:2)

使用泛型来实例化您的集合。您有HashSet / TreeSet,其中包含String以及Integer。不建议这样做。 TreeSet已排序,因此无法与StringInteger排序,因为不会发生隐式转换。如果要对ComparatorString进行排序,请使用Integer界面。

答案 3 :(得分:1)

因为我们在添加到它时知道TreeSet排序元素。这里你是在TreeSet中同时添加字符串和整数所以你有错误。你可以使用不同的树集来表示字符串和整数,然后就可以合并了。