比较器不会删除 TreeSet 中的重复数字

Comparator doesn't remove number duplicates in TreeSet

我使用了一个自定义的比较器来初始化树集,使其成为一个最小堆。删除小数字(如 1、2、3)的重复项效果很好。但是当数字很大时,重复项会保留在树集中。这是我的代码:

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 -2147483647 1 1,我得到 -2147483647 -2147483647 1。我的比较器似乎有问题。我试着调试。当比较-2147483647 和-2147483647 时,比较方法returns 不返回0,而是返回0。有人能告诉我为什么吗?提前致谢!

您正在比较 Integer== 的实例,但应用于对象的 == 仅在它们是同一实例时才进行比较。在您的情况下,i1i2 是两个不同的实例,尽管它们具有相同的值。

使用equals方法比较如下内容:

...
                } else if (i1,equals(i2)) { 
                        return 0; 
...

为什么它适用于小数字:小整数(默认为 -128 到 127)由 Integer class 缓存,以避免每次需要时都必须创建一个新实例.详情:Integer.valueOf(int)

当您使用 valueOf() 创建 Integer 时,会缓存从 -128 到 127 的值。这意味着对于这些值范围,使用运算符 == 进行比较将 return true 如果两个对象具有相同的整数值。对于小于 -128 和大于 127 的整数值不起作用,比较将 return false 用于具有相同值的对象。因此,如果您希望它始终正常工作,请使用 equals() 方法进行比较,而不是 ==