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

问题:

有个代码我判断是否等于字符串的“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記憶體裡有個堆記憶體(heap),簡單記憶就是凡是new出來的,都在堆記憶體裡。
java記憶體還有一塊區域,叫常數池,像是字串常數,都存在這裡面,例如「1」.
「1」肯定在常數池中了,關鍵在於u.getId ()的值,是在常數池中,還是堆記憶體中了。這就要看Util的建構方法的源碼了。截圖中是直接回傳「1」.那就是說在調試中,虛擬機在常量池中分別劃出來兩塊內存,android直接公用同一塊內存了。歧視這就看編譯器的心情了。以後盡量不要用==號,用equals

黄舟

JAVA的問題,看虛擬機器的吧。 JAVA的问题,看虚拟机的吧。

  • == 比较的内存地址

  • 对于字符串的比较用equal

    • == 比較的記憶體位址
  • 🎜對於字串的比較用equal🎜🎜 🎜
左手右手慢动作

字元要用equals比較,基本型別用"=="。因為基本型別是儲存在記憶體中,"=="是比較的記憶體中的存放位址,如果是字元等複合型別即使表面一眼,但是存放位址是有可能不同的,所以如果用「==」是有可能真,有可能假

伊谢尔伦
  1. ==的優先權高於=;

  2. ==比較的是位址,equals比較的是值;

  3. ==是比較兩個字串的位址是否相同,也就是是否是同一個字串的引用;

  4. 字串是存放在常數池中的,一個字面量只會存一份,所以位址會相等,也就是說"1"=="1"回傳的是true。

巴扎黑

==比的是位址,直接運作的時候,虛擬家判斷"1"和"1"都是同一個常數對象,也就是同一個位址,故回傳true。而調試的時候,可能機制不同(可能用的是調試模式的原因吧),導致虛擬機認為兩個'1'字符串不是同一個對象,就返回false了。所以,這你就忽略就好了。 。

刘奇

根據算數運算子解析順序是=在==之前的
所以先解析result = u.getId(),賦值運算結果為布林true
於是就是true==“1”你應該研究true是否等於「1」這個主題。理論上是fasle。
「1」是字串不是int 1,而int 1確實可以表示成布林類型true

洪涛

如果你要比較的字串都是數字的話可以用Integer.parse轉換一下。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板