Java 与原语相比->;整数/整数

Java 与原语相比->;整数/整数,java,performance,compareto,Java,Performance,Compareto,写作更好吗 int primitive1 = 3, primitive2 = 4; Integer a = new Integer(primitive1); Integer b = new Integer(primitive2); int compare = a.compareTo(b); 或 我认为第二个更好,应该更快,更多的内存优化。但是它们不是相等的吗?对于性能,通常最好使代码尽可能简单和清晰,这通常会表现良好(因为JIT会最好地优化代码)。在你的例子中,最简单的例子也可能是最快的 我

写作更好吗

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


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

对于性能,通常最好使代码尽可能简单和清晰,这通常会表现良好(因为JIT会最好地优化代码)。在你的例子中,最简单的例子也可能是最快的


我也愿意

int cmp = a > b ? +1 : a < b ? -1 : 0;
如果不需要,最好不要创建对象

就性能而言,第一个是最好的

如果您确信不会出现溢出,您可以使用

int cmp = a - b; // if you know there wont be an overflow.
你不会比这更快的。

我可以提议第三个吗

((Integer) a).compareTo(b)  

使用。除非能证明存在性能问题,否则不要尝试对代码进行微优化。

将int原语包装到Integer对象中会消耗一些内存,但只有在极少数(内存需求)情况下(包含1000+个元素的数组),差异才会显著。我不建议以这种方式使用新的整数(inta)构造函数。这就足够了:

Integer a = 3; 
关于比较,有一个数学符号(双d)


它们已经是ints了。为什么不用减法呢

compare = a - b;

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

对于1.7之前的版本,我会说它等效于Integer。compare(x,y)是:


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

Comparator.comparingInt(i -> i);
如果要与反向顺序进行比较:

Comparator.comparingInt(i -> -i);

如果您只需要逻辑值(几乎总是这样),以下一行代码将帮助您:

boolean ifIntsEqual = !((Math.max(a,b) - Math.min(a, b)) > 0);
它甚至可以在Java1.5+中使用,甚至可能在1.1中也可以使用(我没有)。请告诉我们,如果你能在1.5-中测试它

这个也可以:

boolean ifIntsEqual = !((Math.abs(a-b)) > 0);

永远不要使用Integer调用“new Integer”。valueOf(int)()此方法访问内部缓存,通常会避免分配小整数。仅供参考:在现代JVM(如HotSpot)上,优化后这两个程序可能会成为相同的机器代码。最好的确定方法是(一如既往地)对这两种解决方案进行基准测试。@luke感谢您的注意,这是一个很好的提示!除了@luke的评论:new Integer()在Java9中将被弃用是一个有效的链接这个方法在JDK中,因为
1.7
,我很抱歉,但对于兼容性问题,我目前还不能使用它。任何类似于1.7之前的例子?@Gaʀʏ,请参阅上面Peter的答案。这是唯一正确的答案。另外,
Integer.compare(x,y)
的整个实现是
return(x因此,在JDK<1.7上,您可以将其粘贴到您自己的静态实用工具methodInteger中。在Java 7之前,Integer没有等效的静态方法(但是Double.compare()也有同样的效果。永远不要使用
cmp=a-b
,即使你“知道”不会有溢出。您不知道不会有溢出。在溢出的情况下,这将产生错误的结果。请尝试
a=Integer.MAX_VALUE
b=-3
。结果将为负数,表示
a
。这将溢出,因为int到double转换发生在减法之后。因此e表达式执行了大量浪费的计算(在第一种情况下,计算错误)来计算a==b,这不是问题所在。
Integer.valueOf(x).compareTo(y);
Comparator.comparingInt(i -> i);
Comparator.comparingInt(i -> -i);
boolean ifIntsEqual = !((Math.max(a,b) - Math.min(a, b)) > 0);
boolean ifIntsEqual = !((Math.abs(a-b)) > 0);