68

是不是更好写

int primitive1 = 3, primitive2 = 4;
Integer a = new Integer(primitive1);
Integer b = new Integer(primitive2);
int compare = a.compareTo(b);

或者

int primitive1 = 3, primitive2 = 4;
int compare = (primitive1 > primitive2) ? 1 : 0;
if(compare == 0){
    compare = (primitive1 == primitive2) ? 0 : -1;
}

我认为第二个更好,应该更快,内存优化更多。但他们不是平等的吗?

4

8 回答 8

144

为了性能,通常最好使代码尽可能简单明了,这样通常会表现良好(因为 JIT 会最好地优化此代码)。在您的情况下,最简单的示例也可能是最快的。


我会做

int cmp = a > b ? +1 : a < b ? -1 : 0;

或更长的版本

int cmp;
if (a > b)
   cmp = +1;
else if (a < b)
   cmp = -1;
else
   cmp = 0;

或者

int cmp = Integer.compare(a, b); // in Java 7
int cmp = Double.compare(a, b); // before Java 7

如果不需要,最好不要创建对象。

性能方面,第一个是最好的。

如果您确定不会溢出,则可以使用

int cmp = a - b; // if you know there wont be an overflow.

你不会比这更快。

于 2012-02-05T15:33:03.157 回答
63

使用Integer.compare(int, int). 除非你能证明你有性能问题,否则不要尝试微优化你的代码。

于 2012-02-05T15:34:03.783 回答
15

我可以提议第三个吗

((Integer) a).compareTo(b)  
于 2012-02-05T15:33:47.900 回答
5

将 int 原语包装到 Integer 对象中会消耗一些内存,但只有在非常罕见的(内存需求)情况下(具有 1000 多个元素的数组),差异才会显着。我不建议以这种方式使用 new Integer(int a) 构造函数。这就足够了:

Integer a = 3; 

关于比较有 Math.signum(double d)。

compare= (int) Math.signum(a-b); 
于 2012-02-05T15:44:39.903 回答
4

他们已经是整数了。为什么不直接使用减法?

compare = a - b;

请注意,Integer.compareTo() 也不一定只返回 -1、0 或 1。

于 2015-05-27T22:57:21.013 回答
4

对于 1.7 之前的版本,我会说 Integer.compare(x, y) 的等价物是:

Integer.valueOf(x).compareTo(y);
于 2015-11-17T15:59:24.343 回答
3

如果您使用的是 java 8,则可以通过以下方法创建 Comparator:

Comparator.comparingInt(i -> i);

如果您想与相反的顺序进行比较:

Comparator.comparingInt(i -> -i);
于 2017-05-20T06:53:36.397 回答
-1

如果您只需要逻辑值(几乎总是如此),以下单行代码将为您提供帮助:

boolean ifIntsEqual = !((Math.max(a,b) - Math.min(a, b)) > 0);

它甚至适用于 Java 1.5+,甚至可能适用于 1.1(我没有)。请告诉我们,如果您可以在 1.5- 中测试它。

这个也可以:

boolean ifIntsEqual = !((Math.abs(a-b)) > 0);
于 2017-12-15T16:35:23.053 回答