Java中的HashSet和TreeSet

Java中的HashSet和TreeSet,java,collections,Java,Collections,但是当我使用Treeset时 true true false true true 它给了我这个例外 Set s = new TreeSet(); 我想知道为什么它显示出这种行为。 TreeSet已排序,它不能将字符串和整数一起排序。 这就是为什么你会得到这个例外 如果只添加相同类型的元素,则不会出现异常 这就是泛型出现的地方,如果您希望集合是类型安全的,那么可以将它们声明为Set Set=new HashSet()或Set Set=new TreeSet() 使用此方法,编译器本身将阻止您

但是当我使用Treeset时

true
true
false
true
true
它给了我这个例外

Set s = new TreeSet();
我想知道为什么它显示出这种行为。

  • TreeSet
    已排序,它不能将
    字符串
    整数
    一起排序。 这就是为什么你会得到这个例外
如果只添加相同类型的元素,则不会出现异常

这就是泛型出现的地方,如果您希望集合是类型安全的,那么可以将它们声明为
Set Set=new HashSet()
Set Set=new TreeSet()

使用此方法,编译器本身将阻止您向
集合添加整数,同样地

  • TreeSet
    已排序,它不能将
    字符串
    整数
    一起排序。 这就是为什么你会得到这个例外
如果只添加相同类型的元素,则不会出现异常

这就是泛型出现的地方,如果您希望集合是类型安全的,那么可以将它们声明为
Set Set=new HashSet()
Set Set=new TreeSet()


使用此方法,编译器本身将阻止您向
Set
添加整数,同样

这里的罪恶根源不是使用泛型。您正在实例化未知对象的集合,并期望Java能够正确地使用它们。不幸的是,这一次它不能-将
字符串
整数
进行比较是不可能的,至少在默认情况下是不可能的


使用
sets=newhashset()
设置s=新树集()。然后编译器会告诉您不能将整数添加到集合中,您将被迫将
整数
转换为
字符串
,所有这些都将正常工作。

这里的罪恶根源不是使用泛型。您正在实例化未知对象的集合,并期望Java能够正确地使用它们。不幸的是,这一次它不能-将
字符串
整数
进行比较是不可能的,至少在默认情况下是不可能的



使用
sets=newhashset()
设置s=新树集()。然后,编译器会告诉您不能向集合添加整数,您将被迫将
整数
转换为
字符串
,所有这些都将正常工作。

使用泛型来实例化集合。您有一个
哈希集
/
树集
,其中包含
字符串
以及
整数
。不建议这样做<代码>树集
已排序,因此无法使用
字符串
整数
进行排序,因为不会发生隐式转换。如果您想对
字符串
整数
进行排序,请使用
比较器
接口

使用泛型来实例化集合。您有一个
哈希集
/
树集
,其中包含
字符串
以及
整数
。不建议这样做<代码>树集
已排序,因此无法使用
字符串
整数
进行排序,因为不会发生隐式转换。如果您想对
字符串
整数
进行排序,请使用
比较器
接口,因为我们知道,在添加到其中时,树集排序元素。这里你在树集合中同时添加字符串和整数,所以你得到了错误。您可以为字符串和整数使用不同的树集,然后可以合并。

正如我们所知,树集排序元素添加到其中。这里你在树集合中同时添加字符串和整数,所以你得到了错误。你可以为字符串和整数使用不同的树集,然后可以合并。

在第15行附近,
TreeSetExample.java
是什么样子的呢?附带说明:你不应该使用非通用版本的
集合。你可能会遇到很多奇怪的问题…@mcalex这是类的名称。重复:TreeSetExample.java
看起来像什么,哦,在第15行附近?附带说明:你不应该使用非泛型版本的
集合
。你可能会遇到很多奇怪的问题…@mcalex是这个类的名称。重复的:@Java\u-Alert为什么要在一个集合中包含不同的对象?@UlfGitschthaler,可能是出于好奇:)@Java\u-Alert,正如我所说,
TreeSet
是一个排序的集合。对于要排序的集合,必须进行一些比较,这就是调用compareTo方法的原因。如果要比较对象,它们必须是相同类型的。因此树集元素应该具有相同的元素type@Java_Alert不是那么简单。您可以给
TreeSet
一个
Comparator
实例,它可以处理您想要的任何排序,包括整数和字符串的大小写。@Java_Alert yes您可以:
public static void main(String[]args){TreeSet objectSet=new TreeSet(new Comparator(){@Override public int compare(ObjectO1,ObjectO2){//在这里添加您的奇怪排序…返回0;}});objectSet.add(1l);objectSet.add(true);objectSet.add(“no”)}
@Java\u Alert为什么要在一个集合中包含不同的对象?@UlfGitschthaler,可能出于好奇:)@Java\u Alert,正如我所说,
TreeSet
是一个分类集合。对于要排序的集合,必须进行一些比较,这就是调用compareTo方法的原因。如果要比较对象,它们必须是相同类型的。因此树集元素应该具有相同的元素type@Java_Alert不是那么简单。您可以给
TreeSet
一个
Comparator
实例,它可以处理您想要的任何排序,包括整数和字符串的大小写。@Java\u警报是的,您可以:
public static void main(String[]args){TreeSet objectSet=new TreeSet(new Comparator
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)