web-dev-qa-db-ja.com

プリミティブを持つcompareTo->整数/ int

書くほうがいいですか

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;
}

2番目の方が優れていると思います。より高速で、より多くのメモリを最適化する必要があります。しかし、それらは同等ではありませんか?

62
Marek Sebera

パフォーマンスを向上させるには、通常、コードをできる限りシンプルかつ明確にすることが最善であり、これは多くの場合うまく機能します(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.

これより速くなることはありません。

137
Peter Lawrey

Integer.compare(int, int) を使用します。また、パフォーマンスの問題があることを証明できる場合を除き、コードを微最適化しないでください。

55
MForster

第三を提案してもいいですか

((Integer) a).compareTo(b)  
13
Johan Sjöberg

IntプリミティブをIntegerオブジェクトにラップするとメモリがいくらか消費されますが、その違いは非常にまれな(メモリ要求)場合(1000以上の要素を持つ配列)でのみ顕著です。この方法で新しいInteger(int a)コンストラクターを使用することはお勧めしません。これで十分です:

Integer a = 3; 

比較については、Math.signum(double d)があります。

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

彼らはすでにintです。単に減算を使用しないのはなぜですか?

compare = a - b;

Integer.compareTo()は、必ずしも-1、0、または1のみを返すわけではないことに注意してください。

4
MQDuck

1.7より前の場合、Integer.compare(x、y)と同等のものは次のようになります。

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

Java 8を使用している場合、次の方法でコンパレータを作成できます。

Comparator.comparingInt(i -> i);

逆順と比較したい場合:

Comparator.comparingInt(i -> -i);
1
tanghao

論理値だけが必要な場合(ほとんどの場合)、次の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);
0
WebComer

次のようなビット操作を介してこれを行うことができます。

(~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
0
Eng.Fouad