compareTo with primitives - > Integer/int

Mar*_*era 62 java performance compareto

写作更好吗?

int primitive1 = 3, primitive2 = 4;
Integer a = new Integer(primitive1);
Integer b = new Integer(primitive2);
int compare = a.compareTo(b);
Run Code Online (Sandbox Code Playgroud)

要么

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

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

Pet*_*rey 137

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


我会做的

int cmp = a > b ? +1 : a < b ? -1 : 0;
Run Code Online (Sandbox Code Playgroud)

或更长的版本

int cmp;
if (a > b)
   cmp = +1;
else if (a < b)
   cmp = -1;
else
   cmp = 0;
Run Code Online (Sandbox Code Playgroud)

要么

int cmp = Integer.compare(a, b); // in Java 7
int cmp = Double.compare(a, b); // before Java 7
Run Code Online (Sandbox Code Playgroud)

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

性能方面,第一是最好的.

如果您确定无法获得溢出,则可以使用

int cmp = a - b; // if you know there wont be an overflow.
Run Code Online (Sandbox Code Playgroud)

你不会比这更快.

  • 在Java 7之前,Integer没有等效的静态方法:(但Double.compare()具有相同的效果. (6认同)
  • 为什么加倍而不是整数? (3认同)

MFo*_*ter 56

使用Integer.compare(int, int).除非您能证明自己存在性能问题,否则不要对代码进行微观优化.

  • 这个方法在JDK中就是`1.7`,对不起,但是对于兼容性问题我到目前为止还不能使用它. (4认同)

Joh*_*erg 13

我可以提出第三个

((Integer) a).compareTo(b)  
Run Code Online (Sandbox Code Playgroud)


小智 6

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

Integer a = 3; 
Run Code Online (Sandbox Code Playgroud)

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

compare= (int) Math.signum(a-b); 
Run Code Online (Sandbox Code Playgroud)