Java中的HashSet和TreeSet

Jav*_*ert 1 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]);
}
Run Code Online (Sandbox Code Playgroud)

这给了我预期的输出: -

true
true
false
true
true
Run Code Online (Sandbox Code Playgroud)

但是当我使用Treeset时

Set s = new TreeSet();
Run Code Online (Sandbox Code Playgroud)

它给了我这个例外.

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)
Run Code Online (Sandbox Code Playgroud)

我想知道为什么它会告诉我这种行为.

Pra*_*kar 6

  • TreeSet是排序的,它不能排序StringInteger一起.这就是为什么你得到这个例外.

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

这是泛型的图片,如果你希望你的集合是类型安全的,那么你可以将它们声明为Set<String> set = new HashSet<String>()Set<Integer> set = new TreeSet<Integer>();

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

  • @Java_Alert这不是那么简单.你可以给`TreeSet`一个`Comparator`实例来处理你想要的任何排序,包括你的Integer和String的情况. (3认同)