Comparator与包装类的工作方式不同吗?

时间:2014-07-27 09:04:47

标签: java comparator

我一直未能从数据库中对学生ID进行排序,经过多长时间弄清楚它为何被错误排序后,我得出结论, Comparator 与Wrapper Class的工作方式不同?

public class comparatorDemo {
public static void main(String[] args) {
    Comparator<Integer> IDComparator = new Comparator<Integer>() {
        @Override
        public int compare(Integer firstID, Integer secondID) {
            return firstID < secondID ? (-1) : (firstID == secondID ? (0) : (1));
        }
            };

  System.out.println(IDComparator.compare(new Integer(1), new Integer(1))); // prints 1
  System.out.println(IDComparator.compare((1),(1))); // prints 0
 }  }  

这里发生了什么?

2 个答案:

答案 0 :(得分:3)

在Java中,当使用==比较两个引用时,结果将是true当且仅当两个引用指向同一个完全对象时。因此,当您将new Integer(1)new Integer(1)进行比较时,==将返回false

使用==与基元进行比较(例如int)时,如果值相等,则会返回true

一种解决方案是使用firstID.equals(secondID)

查看this了解详情

<强>更新

如JBNizet所述,您可以替换

return firstID < secondID ? (-1) : (firstID == secondID ? (0) : (1));

return firstID.compareTo(secondID);

这使代码更容易阅读,当然也使用了正确的比较。

答案 1 :(得分:2)

这是因为有Integer个对象的静态缓存 - 从-128127的每个值都有一个。这用于自动装箱和其他一些操作。

IDComparator.compare(new Integer(1), new Integer(1))中,创建了两个新的Integer个对象,然后与==进行比较。由于它们不是同一个对象,==会返回false,比较器会返回1

IDComparator.compare((1),(1))中,Integer的{​​{1}}值从静态缓存返回两次;但它只是一个1对象。因此Integer返回==,比较器返回true