有个代码我判断是否等于字符串的“1”,因是新手不小心用了==,结果发生了很奇妙的问题。
Util u = new Util();
boolean result = u.getId() == "1";
Toast.makeText(this, String.valueOf(result), Toast.LENGTH_SHORT).show();
结果在手机上运行会提示true(部分华为Android版本5.0以下手机会提示false)
在IDE中调试结果是false
看截图,调度过程中代码后面显示的result:true,可是在计算窗口中显示为false。见鬼了,求解。
Il existe une mémoire tas (heap) dans la mémoire Java. La mémoire simple signifie que tout ce qui est nouveau est dans la mémoire tas.
Il existe également une zone de mémoire Java appelée pool de constantes, comme les constantes de chaîne, qui existent toutes ici, comme "1"
"1" doit être dans le pool de constantes. la clé réside dans u.getId() La valeur se trouve dans le pool de constantes ou dans la mémoire tas. Cela dépend du code source de la méthode de construction d'Util. Dans la capture d'écran, "1" est renvoyé directement. Cela signifie que lors du débogage, la machine virtuelle a alloué deux morceaux de mémoire dans le pool constant et qu'Android partage directement le même morceau de mémoire. La discrimination dépend de l'humeur du compilateur. Essayez de ne pas utiliser == à l'avenir, utilisez égal
Le problème de
JAVA
dépend de la machine virtuelle.== Adresse mémoire comparative
Pour la comparaison de chaînes, utilisez
equal
Les caractères doivent être comparés en utilisant des valeurs égales et les types de base doivent être comparés en utilisant "==". Étant donné que les types de base sont stockés en mémoire, "==" est l'adresse de stockage dans la mémoire à des fins de comparaison. S'il s'agit d'un type composite tel que des caractères, même si cela semble à première vue, l'adresse de stockage peut être différente, donc si. tu utilises "==" c'est possible C'est peut-être vrai, c'est peut-être faux
== a une priorité plus élevée que =;
== compare les adresses, égal compare les valeurs
== consiste à comparer si les adresses des deux chaînes sont les mêmes, c'est-à-dire si ce sont des références à la même chaîne
Les chaînes sont stockées dans le pool constant, et une seule copie d'un littéral est stockée, donc les adresses seront égales, ce qui signifie que
"1"=="1"
renvoie vrai.== compare les adresses. Lors de l'exécution directe, la maison virtuelle juge que "1" et "1" sont le même objet constant, c'est-à-dire la même adresse, donc elle renvoie vrai. Lors du débogage, le mécanisme peut être différent (peut-être parce que le mode de débogage est utilisé), ce qui amène la machine virtuelle à penser que les deux chaînes « 1 » ne sont pas le même objet et renvoie false. Donc, vous pouvez simplement ignorer cela. .
Selon l'ordre d'analyse des opérateurs arithmétiques = est avant ==
Donc, le résultat = u.getId() est analysé en premier, et le résultat de l'opération d'affectation est booléen vrai
Donc c'est vrai==“ 1”. Vous devriez étudier le sujet de savoir si vrai est égal à "1". Théoriquement, c'est faux.
"1" est une chaîne, pas un int 1, et int 1 peut en effet être exprimé comme un type booléen vrai
Si les chaînes que vous souhaitez comparer sont toutes des nombres, vous pouvez utiliser Integer.parse pour les convertir.