Java 比较器不会删除树集合中的重复数
我使用了一个自定义的比较器来初始化treeset,使它成为一个最小的堆。它可以很好地删除小数字的重复项,例如1、2、3。但当数字较大时,重复项仍保留在树集中。这是我的密码:Java 比较器不会删除树集合中的重复数,java,arrays,integer,heap,comparator,Java,Arrays,Integer,Heap,Comparator,我使用了一个自定义的比较器来初始化treeset,使它成为一个最小的堆。它可以很好地删除小数字的重复项,例如1、2、3。但当数字较大时,重复项仍保留在树集中。这是我的密码: public class Test { public static void main(String[] args) { Set<Integer> treeset = new TreeSet<>(new MyComparator()); I
public class Test {
public static void main(String[] args) {
Set<Integer> treeset = new TreeSet<>(new MyComparator());
Integer[] array = new Integer[args.length];
for (int i = 0 ; i < args.length ; i ++ ) {
array[i] = Integer.valueOf(args[i]);
treeset.add(array[i]);
}
for (Integer i : treeset) {
System.out.print(i + " ");
}
}
public static class MyComparator implements Comparator<Integer> {
@Override
public int compare(Integer i1, Integer i2) {
if (i1 < i2) {
return -1;
} else if (i1 == i2) {
return 0;
} else {
return 1;
}
}
}
}
如果我做java测试-2147483647-214748364711,我得到-2147483647-214748364711。我的比较仪好像有点问题。我试着调试。比较-2147483647和-2147483647时,compare方法返回1,而不是返回0。有人能告诉我为什么吗?提前谢谢你 您正在比较应用于对象的Integer实例与==,但是==,仅当它们是同一实例时才进行比较。在您的例子中,i1和i2是两个不同的实例,尽管它们具有相同的值 使用equals方法比较内容,如:
...
} else if (i1,equals(i2)) {
return 0;
...
为什么它使用小数字:默认情况下,Integer类缓存128到127的小整数,以避免每次需要时都必须创建新实例。详细信息:当您创建一个整数时,将缓存-128到127之间的值。这意味着,对于这些值范围,如果两个对象具有相同的整数值,则使用运算符==进行比较将返回true。对于不起作用的小于-128且大于127的整数值,对于具有相同值的对象,比较将返回false。因此,如果您想让它一直正常工作,请使用equals方法进行比较,而不是==方法。非常棒的解释!非常感谢。