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 ?
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.
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!
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