web-dev-qa-db-fra.com

Comparaison de la valeur entière

Je suis un débutant Java coder et je viens de lire une variable d'une classe entière peut être décrite de trois manières différentes dans l'API. J'ai le code suivant:

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

C'est à l'intérieur d'une boucle et sort juste out_table.
Mon objectif est de savoir comment voir si la valeur en entier count > 0.

Je me rends compte que la count.compare(0) est la bonne façon? ou est-ce count.equals(0)?

Je sais que count == 0 Est incorrect. Est-ce correct? Y a-t-il un opérateur de comparaison de valeurs où son juste count=0?

26
phill

Les nombres entiers sont mis en boîte automatique, vous pouvez donc simplement faire

if (count > 0) {
    .... 
}
25
Nathaniel Flath

Pour savoir si un Integer est supérieur à 0, vous pouvez:

  • vérifier si compareTo(O) renvoie un nombre positif:

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

    Mais ça a l'air assez idiot, non? Mieux vaut juste ...

  • utilisez autoboxing1:

    if (count > 0)
        ....
    

    Cela équivaut à:

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

    Il est important de noter que "==" Est évalué comme ceci, avec l'opérande Integer sans boîte plutôt qu'avec l'opérande int en boîte. Sinon, count == 0 Renverrait false lorsque count a été initialisé en tant que new Integer(0) (car "==" Teste l'égalité de référence).

1Techniquement, le premier exemple utilise autoboxing (avant Java 1.5 vous ne pouviez pas passer un int à compareTo) et le second exemple utilise nboxing . La fonctionnalité combinée est souvent simplement appelée "autoboxing" pour faire court, qui est souvent ensuite étendue en appelant les deux types de conversions "autoboxing". Je m'excuse pour mon utilisation laxiste de la terminologie.

30
Michael Myers

Il vaut mieux éviter les boites automatiques inutiles pour 2 raisons.

D'une part, c'est un peu plus lent que int < int, Car vous créez (parfois) un objet supplémentaire;

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

Le plus gros problème est que le masquage automatique masqué peut masquer les exceptions:

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

L'appel de cette méthode avec null lancera un NullPointerException.

La séparation entre les primitives et les objets wrapper dans Java a toujours été décrite comme un kludge pour la vitesse. Autoboxing cache presque cela, mais pas tout à fait - il est plus propre de garder une trace du type. Donc, si vous '' J'ai un objet Integer, vous pouvez simplement appeler compare() ou intValue(), et si vous avez la primitive, vérifiez simplement la valeur directement.

13
Steve B.

Vous pouvez également utiliser égal à:

 Integer a = 0;

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

ce qui équivaut à:

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

et aussi:

 if (a == 0) {

 }

(le compilateur Java ajoute automatiquement intValue ())

Notez que l'autoboxing/autounboxing peut introduire une surcharge importante (en particulier à l'intérieur des boucles).

13
dfa

Bien que vous puissiez certainement utiliser la méthode compareTo sur une instance Integer, ce n'est pas clair lors de la lecture du code, vous devriez donc probablement éviter de le faire.

Java vous permet d'utiliser l'autoboxing (voir http://Java.Sun.com/j2se/1.5.0/docs/guide/language/autoboxing.html ) pour comparer directement avec un int, donc vous peut faire:

if (count > 0) { }

Et l'instance Integercount est automatiquement convertie en int pour la comparaison.

Si vous ne parvenez pas à comprendre cela, consultez le lien ci-dessus, ou imaginez que c'est le cas:

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

Une autre chose à surveiller est que si la deuxième valeur était un autre objet Integer au lieu d'un littéral "0", l'opérateur "==" compare les pointeurs d'objet et ne désélectionne pas automatiquement.

c'est à dire:

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
1
Sogger