Android "1"=="1" 到底是true还是false
高洛峰
高洛峰 2017-04-17 17:36:46
0
7
793

问题:

有个代码我判断是否等于字符串的“1”,因是新手不小心用了==,结果发生了很奇妙的问题。

Util u = new Util();
boolean result = u.getId() == "1";
Toast.makeText(this, String.valueOf(result), Toast.LENGTH_SHORT).show();
  1. 结果在手机上运行会提示true(部分华为Android版本5.0以下手机会提示false)

  2. 在IDE中调试结果是false

看截图,调度过程中代码后面显示的result:true,可是在计算窗口中显示为false。见鬼了,求解。

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全員に返信(7)
黄舟

Java メモリにはヒープ メモリ (ヒープ) があり、単純メモリとは、新しく出てくるものはすべてヒープ メモリにあることを意味します。
Java メモリには定数プールと呼ばれる領域もあり、文字列定数などはすべてここに存在します。
"1" は定数プール内に存在する必要があります。キーは u.getId() にあります。値は定数プールまたはヒープ メモリにあります。これはUtilの構築方法のソースコードに依存します。スクリーンショットでは、「1」が直接返されています。これは、デバッグ中に仮想マシンが定数プールに 2 つのメモリを割り当て、Android が同じメモリを直接共有していることを意味します。識別はコンパイラの気分に依存します。今後は == を使用せず、equals

を使用してください。
いいねを押す +0
黄舟

JAVA の問題は仮想マシンに依存します。

  • == 比較メモリアドレス

  • 文字列比較には equal

  • を使用します
いいねを押す +0
左手右手慢动作

文字は等号を使用して比較する必要があり、基本型は「==」を使用して比較する必要があります。基本型はメモリ上に格納されるため、「==」は比較用のメモリ内の格納アドレスになります。文字などの複合型の場合は一見しても格納先アドレスが異なる場合がありますので、 "==" を使用すると、それは可能です。 true かもしれないし、false かもしれません

いいねを押す +0
伊谢尔伦
  1. == は

  2. よりも優先されます。
  3. == はアドレスを比較し、equals は値を比較します。

  4. == は、2 つの文字列のアドレスが同じかどうか、つまり、同じ文字列への参照であるかどうかを比較します。
  5. 文字列は定数プールに格納され、リテラルのコピーは 1 つだけ格納されるため、アドレスは等しくなります。これは、

    が true を返すことを意味します。
いいねを押す +0
巴扎黑

== はアドレスを比較します。直接実行すると、仮想ホームは「1」と「1」が同じ定数オブジェクト、つまり同じアドレスであると判断し、true を返します。デバッグ時にメカニズムが異なる場合があり (デバッグ モードが使用されているためなど)、仮想マシンは 2 つの「1」文字列が同じオブジェクトではないと判断し、false を返します。したがって、これは無視してください。 。

いいねを押す +0
刘奇

算術演算子の解析順序によると = は == より前です
結果 = u.getId() が最初に解析され、代入演算の結果はブール値 true です
したがって true==” 1」は、true が「1」に等しいかどうかというトピックを勉強する必要があります。理論的にはファスルです。
「1」は int 1 ではなく文字列であり、int 1 は確かにブール型 true として表現できます

いいねを押す +0
洪涛

比較したい文字列がすべて数値の場合は、Integer.parse を使用して変換できます。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート