2014-07-27 64 views
0

我不断从数据库中排序学生ID,经过很长时间搞清楚为什么它得到排序不正确,我的结论是这个比较与包装类的工作方式不同?Comparator与包装类有什么不同?

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

请使用经常使用的'Integer.valueOf()'获取缓存的Integer对象! – Unihedron

+2

@Unihedron - 不需要。上面第二次调用“compare”的自动装箱功能可以解决这个问题。 –

回答

3

在Java中,当使用==比较两个引用时,当且仅当两个引用指向相同的确切对象时,结果将为true。所以,当你与new Integer(1)比较new Integer(1)==将返回false

当使用==要比较的原语(如int),那么当值相等true将被退回。

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

退房this了解更多信息

UPDATE

正如JBNizet提到的,可以更换

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

return firstID.compareTo(secondID);

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

+1

一个简单的解决方案是简单地使用'return firstID.compareTo(secondID)',它返回所需的结果。 –

+0

@JBNizet像往常一样,你是正确的:)。因为我想显示'=='和'equals'之间的区别,所以我的思维甚至没有去那里。你介意我是否将你的建议添加到答案中?我当然会提到你指出了它! – geoand

+0

当然,我不介意。 –

2

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

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

IDComparator.compare((1),(1))中,的值为1从静态缓存返回两次;但它只是一个Integer对象。所以==返回true和比较器返回0

相关问题