compareTo with primitives - >整数/ int

时间:2012-02-05 15:30:36

标签: java performance compareto

是否更好
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;
}

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

9 个答案:

答案 0 :(得分:135)

为了提高性能,通常最好使代码尽可能简单明了,这通常表现良好(因为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.

你不会比这更快。

答案 1 :(得分:54)

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

答案 2 :(得分:13)

我可以提出第三个

((Integer) a).compareTo(b)  

答案 3 :(得分:6)

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

Integer a = 3; 

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

compare= (int) Math.signum(a-b); 

答案 4 :(得分:4)

他们已经完成了。为什么不使用减法?

compare = a - b;

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

答案 5 :(得分:3)

对于1.7之前,我会说相当于Integer.compare(x,y)的是:

Integer.valueOf(x).compareTo(y);

答案 6 :(得分:1)

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

Comparator.comparingInt(i -> i);

如果您想与逆序进行比较:

Comparator.comparingInt(i -> -i);

答案 7 :(得分:0)

您可以通过位操作来完成此操作,如下所示:

(~a - ~b) >>> 31 | -((a - b) >>> 31)
public static void main(String[] args)
{
    int a = 107;
    int b = 106;
    check(a, b);

    a = 106;
    b = 106;
    check(a, b);

    a = 106;
    b = 107;
    check(a, b);
}

public static void check(int a, int b)
{
    System.out.println((~a - ~b) >>> 31 | -((a - b) >>> 31));
}

<强>输出:

1
0
-1

答案 8 :(得分:0)

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

#include <fstream>
#include <memory>
#include <vector>
#include <ios>

int main()
{
    std::vector<std::unique_ptr<std::ofstream>> streams;

    auto os = std::make_unique<std::ofstream>("foo.txt", std::ios::binary | std::ios::app);
    streams.push_back(std::move(os));
}

它甚至可以在Java 1.5+中工作,甚至可能在1.1(我没有)。请告诉我们,如果你可以在1.5 - 。

进行测试

这个也会这样做:

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