我一直未能从数据库中对学生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
} }
这里发生了什么?
答案 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
个对象的静态缓存 - 从-128
到127
的每个值都有一个。这用于自动装箱和其他一些操作。
在IDComparator.compare(new Integer(1), new Integer(1))
中,创建了两个新的Integer
个对象,然后与==
进行比较。由于它们不是同一个对象,==
会返回false
,比较器会返回1
。
在IDComparator.compare((1),(1))
中,Integer
的{{1}}值从静态缓存返回两次;但它只是一个1
对象。因此Integer
返回==
,比较器返回true
。