comment déclarer i et j pour en faire une boucle infinie?

while( i <= j && i >= j && i != j) {}

Comment déclarer i et j pour en faire une boucle infinie ?

// c'est une question d'entrevue que j'ai rencontré.

C'est demander quelles sont les déclarations de i et j, faites-le toujours vrai.

Et je ne peux pas le faire en déclarant i et j comme types de nombres. Quels autres types peuvent le rencontrer ?

23
demandé sur Alan 2011-11-05 00:07:45

3 réponses

Integer i=new Integer(1000);
Integer j=new Integer(1000);

System.out.println((i<=j)+" "+(i>=j)+" "+(i!=j));

i et j sera automatiquement unboxed à ints pour <= et >=, mais pas pour !=. i et j sont des instances différentes, mais ont la même valeur int. C'est pourquoi les trois comparaisons retourneront vraies.

38
répondu Piotr Praszmo 2011-11-04 20:59:19

Cela fonctionne aussi ("sur ma machine"):

Integer a = 128, b = 128;

Alors que cela ne fonctionnera pas:

Integer a = 127, b = 127;

Auto-boxing un int est le sucre syntaxique pour un appel à Integer.valueOf(int). Cette fonction utilise un cache pour les valeurs de -128 à 127 inclus. Il peut mettre en cache d'autres valeurs, mais dans mon cas, ce n'est pas le cas.

Ainsi, l'affectation de 128 n'a pas de hit cache; elle crée une nouvelle instance Integer à chaque opération d'auto-boxe, et la comparaison de référence a != b est vraie. L'affectation de 127 a un hit cache, et les objets Integer résultants sont vraiment la même instance du cache. Donc, la comparaison de référence a != b est fausse.

Ce que je veux vraiment souligner est de se méfier de la comparaison de référence avec l'auto-boxe. Un problème plus probable dans le monde réel est que vous vous attendez à ce que a == b soit vrai car ils ont reçu la même valeur (auto-boxed), vous exécutez des tests unitaires qui confirment votre attente, puis votre code échoue "dans la nature" quand un compteur dépasse la limite supérieure de cache. Des moments de plaisir!

3
répondu erickson 2014-05-26 11:36:20

Toute valeur égale de ' i ' et 'j' révélera vrai avec la déclaration donnée, disons:

Integer i = new Integer(1);
Integer j = new Integer(1);

while( i <= j && i >= j && i != j) {}

La magie est avec l'opérateur utilisé! En cas de!= opérateur le compilateur prend les opérandes en tant qu'objets(y compris leurs valeurs) alors que dans le cas de > = ou

-2
répondu Elias Hossain 2011-11-20 09:17:12