有个代码我判断是否等于字符串的“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。见鬼了,求解。
黄舟2017-04-17 17:38:46
Java メモリにはヒープ メモリ (ヒープ) があり、単純メモリとは、新しく出てくるものはすべてヒープ メモリにあることを意味します。
Java メモリには定数プールと呼ばれる領域もあり、文字列定数などはすべてここに存在します。
"1" は定数プール内に存在する必要があります。キーは u.getId() にあります。値は定数プールまたはヒープ メモリにあります。これはUtilの構築方法のソースコードに依存します。スクリーンショットでは、「1」が直接返されています。これは、デバッグ中に仮想マシンが定数プールに 2 つのメモリを割り当て、Android が同じメモリを直接共有していることを意味します。識別はコンパイラの気分に依存します。今後は == を使用せず、equals
ringa_lee2017-04-17 17:38:46
文字は等号を使用して比較する必要があり、基本型は「==」を使用して比較する必要があります。基本型はメモリ上に格納されるため、「==」は比較用のメモリ内の格納アドレスになります。文字などの複合型の場合は一見しても格納先アドレスが異なる場合がありますので、 "==" を使用すると、それは可能です。 true かもしれないし、false かもしれません
伊谢尔伦2017-04-17 17:38:46
== は
== はアドレスを比較し、equals は値を比較します。
文字列は定数プールに格納され、リテラルのコピーは 1 つだけ格納されるため、アドレスは等しくなります。これは、
が true を返すことを意味します。巴扎黑2017-04-17 17:38:46
== はアドレスを比較します。直接実行すると、仮想ホームは「1」と「1」が同じ定数オブジェクト、つまり同じアドレスであると判断し、true を返します。デバッグ時にメカニズムが異なる場合があり (デバッグ モードが使用されているためなど)、仮想マシンは 2 つの「1」文字列が同じオブジェクトではないと判断し、false を返します。したがって、これは無視してください。 。
怪我咯2017-04-17 17:38:46
算術演算子の解析順序によると = は == より前です
結果 = u.getId() が最初に解析され、代入演算の結果はブール値 true です
したがって true==” 1」は、true が「1」に等しいかどうかというトピックを勉強する必要があります。理論的にはファスルです。
「1」は int 1 ではなく文字列であり、int 1 は確かにブール型 true として表現できます