有个代码我判断是否等于字符串的“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。见鬼了,求解。
java記憶體裡有個堆記憶體(heap),簡單記憶就是凡是new出來的,都在堆記憶體裡。
java記憶體還有一塊區域,叫常數池,像是字串常數,都存在這裡面,例如「1」.
「1」肯定在常數池中了,關鍵在於u.getId ()的值,是在常數池中,還是堆記憶體中了。這就要看Util的建構方法的源碼了。截圖中是直接回傳「1」.那就是說在調試中,虛擬機在常量池中分別劃出來兩塊內存,android直接公用同一塊內存了。歧視這就看編譯器的心情了。以後盡量不要用==號,用equals
JAVA
的問題,看虛擬機器的吧。JAVA
的问题,看虚拟机的吧。== 比较的内存地址
对于字符串的比较用
equal
equal
🎜🎜 🎜字元要用equals比較,基本型別用"=="。因為基本型別是儲存在記憶體中,"=="是比較的記憶體中的存放位址,如果是字元等複合型別即使表面一眼,但是存放位址是有可能不同的,所以如果用「==」是有可能真,有可能假
==的優先權高於=;
==比較的是位址,equals比較的是值;
==是比較兩個字串的位址是否相同,也就是是否是同一個字串的引用;
字串是存放在常數池中的,一個字面量只會存一份,所以位址會相等,也就是說
"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轉換一下。