搜尋

首頁  >  問答  >  主體

Android "1"=="1" 到底是true还是false

问题:

有个代码我判断是否等于字符串的“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。见鬼了,求解。

高洛峰高洛峰2886 天前792

全部回覆(7)我來回復

  • 黄舟

    黄舟2017-04-17 17:38:46

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

    回覆
    0
  • 黄舟

    黄舟2017-04-17 17:38:46

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

    • == 比较的内存地址

    • 对于字符串的比较用equal

      • == 比較的記憶體位址
    • 🎜對於字串的比較用equal🎜🎜 🎜

      回覆
      0
  • ringa_lee

    ringa_lee2017-04-17 17:38:46

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

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 17:38:46

    1. ==的優先權高於=;

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

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

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

    回覆
    0
  • 巴扎黑

    巴扎黑2017-04-17 17:38:46

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

    回覆
    0
  • 怪我咯

    怪我咯2017-04-17 17:38:46

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

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-17 17:38:46

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

    回覆
    0
  • 取消回覆