CompareTo mit Primitives -> Integer / int

Lesezeit: 4 Minuten

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, der zweite ist besser, sollte schneller und speicheroptimierter sein. Aber sind sie nicht gleich?

  • Rufen Sie niemals “new Integer” auf, sondern verwenden Sie Integer.valueOf(int) (docs.oracle.com/javase/6/docs/api/java/lang/…) greift diese Methode auf einen internen Cache zu und vermeidet häufig eine Zuordnung für kleine Ganzzahlen.

    – Lukas

    5. Februar 2012 um 15:35 Uhr

  • FYI: Auf modernen JVMs (wie HotSpot) werden die beiden Programme nach der Optimierung wahrscheinlich zum gleichen Maschinencode. Der beste Weg, um sicher zu sein, ist (wie immer) ein Benchmarking beider Lösungen.

    – Adam Paynter

    5. Februar 2012 um 15:35 Uhr

  • @luke danke für den Hinweis, das ist ein toller Tipp!

    – Marek Sebera

    5. Februar 2012 um 15:39 Uhr

  • Zusätzlich zum Kommentar von @luke: new Integer() wird in Java9 veraltet sein download.java.net/java/jdk9/docs/api/java/lang/…

    – Naxos84

    27. Oktober 2016 um 7:11 Uhr

  • docs.oracle.com/javase/9/docs/api/java/lang/… ist ein funktionierender Link

    – Martin Wseticka

    18. Januar 2019 um 14:18 Uhr

CompareTo mit Primitives Integer int
Peter Lawrey

Für die Leistung ist es normalerweise am besten, den Code so einfach und klar wie möglich zu gestalten, und dies wird oft gut funktionieren (da das JIT diesen Code am besten optimiert). In Ihrem Fall sind die einfachsten Beispiele wahrscheinlich auch die schnellsten.


Ich würde beides 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, kein Objekt zu erstellen, wenn Sie es nicht müssen.

In Bezug auf die Leistung ist die erste am besten.

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.

  • Integer hat vor Java 7 keine äquivalente statische Methode. 🙁 Aber Double.compare() hat den gleichen Effekt.

    – Peter Lawrey

    5. Februar 2012 um 15:37 Uhr


  • Benutze niemals cmp = a - b, auch wenn Sie “wissen”, dass es keinen Überlauf geben wird. Sie wissen nicht, dass es keinen Überlauf geben wird.

    – Clemens Cherlin

    9. Juni 2020 um 13:35 Uhr

  • Es wird keinen Überlauf geben, wenn beides der Fall ist a und b sind beispielsweise positive ganze Zahlen.

    – DV82XL

    8. November 2021 um 20:15 Uhr

Verwenden Integer.compare(int, int). Und versuchen Sie nicht, Ihren Code mikrooptimieren, es sei denn, Sie können nachweisen, dass Sie ein Leistungsproblem haben.

  • Diese Methode ist seit dem in JDK enthalten 1.7tut mir leid, aber aus Kompatibilitätsgründen kann ich es bisher nicht verwenden.

    – Marek Sebera

    5. Februar 2012 um 15:37 Uhr

  • Irgendein Beispiel vor 1.7 wie dieses?

    – Gaʀʀʏ

    16. Januar 2014 um 19:50 Uhr

  • @Gaʀʀʏ, siehe Peters Antwort oben.

    – MForster

    17. Januar 2014 um 7:55 Uhr

  • Dies ist die einzig richtige Antwort. Darüber hinaus ist die gesamte Implementierung von Integer.compare(x, y) ist return (x < y) ? -1 : ((x == y) ? 0 : 1); Auf JDK < 1.7 können Sie das also in Ihre eigene statische Hilfsmethode einfügen

    – Clemens Cherlin

    9. Juni 2020 um 13:38 Uhr


CompareTo mit Primitives Integer int
Johan Sjöberg

Darf ich einen dritten vorschlagen

((Integer) a).compareTo(b)  

Das Verpacken von int-Primitiven in Integer-Objekte kostet Sie etwas Speicher, aber der Unterschied wird nur in sehr seltenen Fällen (Speicherbedarf) signifikant sein (Array mit mehr als 1000 Elementen). Ich werde die Verwendung des new Integer(int a)-Konstruktors auf diese Weise nicht empfehlen. Das wird genügen:

Integer a = 3; 

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

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

Sie sind bereits ints. Warum nicht einfach Subtraktion verwenden?

compare = a - b;

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

  • Dies führt im Falle eines Überlaufs zu fehlerhaften Ergebnissen. Versuchen a = Integer.MAX_VALUE und b = -3. Das Ergebnis wird negativ sein, was darauf hinweist a < b.

    – Jim Mischel

    3. Oktober 2016 um 12:43 Uhr

1647177428 872 CompareTo mit Primitives Integer int
David

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

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

  • Dies führt im Falle eines Überlaufs zu fehlerhaften Ergebnissen. Versuchen a = Integer.MAX_VALUE und b = -3. Das Ergebnis wird negativ sein, was darauf hinweist a < b.

    – Jim Mischel

    3. Oktober 2016 um 12:43 Uhr

1647177429 588 CompareTo mit Primitives Integer int
tanghao

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

Comparator.comparingInt(i -> i);

wenn Sie mit umgekehrter Reihenfolge vergleichen möchten:

Comparator.comparingInt(i -> -i);

997810cookie-checkCompareTo mit Primitives -> Integer / int

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy