Frage

Ich bin ein Neuling Java-Coder und ich habe gerade gelesen eine Variable eines Integer-Klasse kann auf drei verschiedene Arten in der API beschrieben. Ich habe den folgenden Code:

if (count.compareTo(0)) { 
            System.out.println(out_table);
            count++;
    }

Dies ist innerhalb einer Schleife und nur gibt out_table.
Mein Ziel ist es, herauszufinden, wie wenn der Wert in integer count > 0 zu sehen.

Ich weiß, das count.compare(0) ist der richtige Weg? oder ist es count.equals(0)?

Ich weiß, dass die count == 0 falsch ist. Ist das richtig? Gibt es einen Wert Vergleichsoperator, wo seine nur count=0?

War es hilfreich?

Lösung

Die ganzen Zahlen sind autounboxed, so können Sie einfach tun

if (count > 0) {
    .... 
}

Andere Tipps

Um herauszufinden, ob ein Integer größer als 0 ist, können Sie:

  • prüfen, ob compareTo(O) eine positive Zahl zurückgibt:

    if (count.compareTo(0) > 0)
         ...
    

    Aber das sieht ziemlich dumm, nicht wahr? Besser nur ...

  • Autoboxing < sup> 1 :

    if (count > 0)
        ....
    

    Dies entspricht:

    if (count.intValue() > 0)
        ...
    

    Es ist wichtig zu beachten, dass „==“ wird wie folgt ausgewertet, mit dem Integer Operanden unboxed statt dem int Operanden eingerahmt. Andernfalls würde zurückkehren count == 0 falsch, wenn count als new Integer(0) initialisiert wurde (weil "==" Tests als Referenz Gleichheit).

1 Technisch gesehen ist das erste Beispiel verwendet Autoboxing (vor Java 1.5 Sie keine int passieren könnte compareTo) und das zweite Beispiel verwendet Unboxing . Die kombinierte Funktion wird oft einfach als „Autoboxing“ kurz genannt, die oft verlängert wird dann in beide Arten von Conversions „Autoboxing“ aufrufen. Ich entschuldige mich für meine lax Verwendung der Terminologie.

Es ist besser, um unnötigen Autoboxing aus 2 Gründen zu vermeiden.

Für eine Sache, ist es ein bisschen langsamer als int < int, wie du bist (manchmal) ein zusätzliches Objekt zu erzeugen;

void doSomethingWith(Integer integerObject){ ...
  int i = 1000;
  doSomethingWith(i);//gets compiled into doSomethingWith(Integer.valueOf(i));

Das größere Problem ist, dass versteckte Autoboxing Ausnahmen verbergen kann:

void doSomethingWith (Integer count){
  if (count>0)  // gets compiled into count.intValue()>0

Beim Aufruf dieser Methode mit null eine NullPointerException werfen.

Die Spaltung zwischen Primitiven und Wrapper-Objekten in Java wurde immer als eine Behelfslösung für Geschwindigkeit beschrieben. Autoboxing versteckt fast dies, aber nicht ganz - es ist sauberer nur den Überblick über die Art zu halten. Wenn Sie also ein Integer-Objekt haben, können Sie einfach anrufen compare() oder intValue(), und wenn man die primitive hat nur den Wert direkt überprüfen.

Sie können auch verwenden, ist gleich:

 Integer a = 0;

 if (a.equals(0)) {
     // a == 0
 }

das ist äquivalent zu:

 if (a.intValue() == 0) {
     // a == 0
 }

und auch:

 if (a == 0) {

 }

(der Java-Compiler fügt automatisch intValue ())

Beachten Sie, dass Autoboxing / autounboxing einen erheblichen Aufwand einführen kann (vor allem innerhalb von Schleifen).

Obwohl Sie sicherlich die compareTo Methode auf einer Integer-Instanz verwenden könnten, ist es nicht klar ist, wenn Sie den Code lesen, so sollten Sie vielleicht vermeiden, so zu tun.

Java ermöglicht es Ihnen, Autoboxing zu verwenden (siehe http : //java.sun.com/j2se/1.5.0/docs/guide/language/autoboxing.html ) direkt mit einem int zu vergleichen, so dass Sie tun können:

if (count > 0) { }

Und die Integer Instanz count wird zu einem int für den Vergleich automatisch konvertiert.

Wenn Sie Probleme haben, dies zu verstehen, überprüfen Sie den Link oben aus, oder sich vorstellen, es tut dies:

if (count.intValue() > 0) { }

Eine weitere Sache zu achten ist, wenn der zweite Wert einen anderen Integer-Objekt anstelle einer wörtlichen war ‚0‘, die ‚==‘ Operator vergleicht die Objektzeiger und wird nicht auto-unbox.

ie:

Integer a = new Integer(0);   
Integer b = new Integer(0);   
int c = 0;

boolean isSame_EqOperator = (a==b); //false!
boolean isSame_EqMethod = (a.equals(b)); //true
boolean isSame_EqAutoUnbox = ((a==c) && (a.equals(c)); //also true, because of auto-unbox

//Note: for initializing a and b, the Integer constructor 
// is called explicitly to avoid integer object caching 
// for the purpose of the example.
// Calling it explicitly ensures each integer is created 
// as a separate object as intended.
// Edited in response to comment by @nolith

Nun, ich auf diese spät vielleicht, aber ich möchte etwas teilen:

den Eingang Gegeben:     System.out.println (isGreaterThanZero (-1));

public static boolean isGreaterThanZero(Integer value) {
    return value == null?false:value.compareTo(0) > 0;
}

Returns false

public static boolean isGreaterThanZero(Integer value) {
    return value == null?false:value.intValue() > 0;
}

Gibt true zurück Also ich denke, in yourcase 'compareTo' wird genauer.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top