web-dev-qa-db-de.com

compareTo mit Primitiven -> Integer/Int

Ist es besser zu schreiben?

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

oder 

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

Ich denke, die zweite ist besser, sollte schneller und mehr Speicher optimiert werden. Aber sind sie nicht gleich?

61
Marek Sebera

Für die Leistung ist es in der Regel am besten, den Code so einfach und klar wie möglich zu gestalten. Dies wird häufig gut funktionieren (da die JIT diesen Code am besten optimiert). In Ihrem Fall dürften die einfachsten Beispiele auch die schnellsten sein.


Ich würde entweder tun

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

oder eine längere Version

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

oder

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

Es ist am besten, ein Objekt nicht zu erstellen, wenn Sie dies nicht benötigen.

Die erste ist die beste Leistung.

Wenn Sie sicher sind, dass Sie keinen Überlauf bekommen, können Sie verwenden

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

schneller wirst du nicht.

135
Peter Lawrey

Verwenden Sie Integer.compare(int, int) . Versuchen Sie nicht, Ihren Code zu optimieren, es sei denn, Sie können ein Leistungsproblem nachweisen.

52
MForster

Darf ich einen dritten vorschlagen?

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

Das Umschließen eines Int-Elements in ein Integer-Objekt kostet etwas Speicher, der Unterschied wird jedoch nur in sehr seltenen Fällen (Speicherbedarf) (Array mit 1000 Elementen) auftreten. Ich werde die Verwendung des neuen Integer (int a) -Konstruktors auf diese Weise nicht empfehlen. Das reicht aus:

Integer a = 3; 

Zum Vergleich gibt es Math.signum (double d).

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

Sie sind schon ints. Warum nicht einfach die Subtraktion verwenden?

compare = a - b;

Beachten Sie, dass Integer.compareTo () nicht unbedingt auch nur -1, 0 oder 1 zurückgibt.

4
user3697618

Für pre 1.7 würde ich sagen, dass ein Äquivalent zu Integer.compare (x, y) ist:

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

Wenn Sie Java 8 verwenden, können Sie Comparator mit dieser Methode erstellen:

Comparator.comparingInt(i -> i);

wenn Sie mit einer umgekehrten Bestellung vergleichen möchten:

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

Wenn Sie nur einen logischen Wert benötigen (wie fast immer), hilft Ihnen der folgende Einzeiler:

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

Und es funktioniert sogar in Java 1.5+, vielleicht sogar in 1.1 (ich habe keine). Bitte sagen Sie uns, ob Sie es in 1.5- testen können.

Dieses wird auch tun:

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

Sie können dies über die Bitmanipulation tun, etwa wie folgt:

(~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));
}

AUSGABE:

1
0
-1
0
Eng.Fouad