cari

Rumah  >  Soal Jawab  >  teks badan

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。见鬼了,求解。

高洛峰高洛峰2772 hari yang lalu751

membalas semua(7)saya akan balas

  • 黄舟

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

    java内存里有个堆内存(heap),简单记忆就是凡是new出来的,都在堆内存里。
    java内存还有一块区域,叫常量池,像是字符串常量,都存在这里面,比如“1”.
    “1”肯定在常量池中了,关键在于u.getId()的值,是在常量池中,还是堆内存中了。这就要看Util的构造方法的源码了。截图中是直接返回“1”.那么就是说在调试中,虚拟机在常量池中分别划出来两块内存,android直接公用同一块内存了。歧视这就看编译器的心情了。以后尽量不要用==号,用equals

    balas
    0
  • 黄舟

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

    JAVA的问题,看虚拟机的吧。

    • == 比较的内存地址

    • 对于字符串的比较用equal

    balas
    0
  • ringa_lee

    ringa_lee2017-04-17 17:38:46

    字符要用equals比较,基本类型用"=="。因为基本类型是存储在内存中,"=="是比较的内存中的存放地址,如果是字符等复合类型即使表面一眼,但是存放地址是有可能不同的,所以如果用“==”是有可能真,有可能假

    balas
    0
  • 伊谢尔伦

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

    1. ==的优先级高于=;

    2. ==比较的是地址,equals比较的是值;

    3. ==是比较两字符串的地址是否相同,也就是是否是同一个字符串的引用;

    4. 字符串是存放在常量池中的,一个字面量只会存一份,所以地址会相等,也就是说"1"=="1"返回的是true。

    balas
    0
  • 巴扎黑

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

    ==比的是地址,直接运行的时候,虚拟家判断"1"和"1"都是同一个常数对象,也就是同一个地址,故返回true。而调试的时候,可能机制不同(可能用的是调试模式的原因吧),导致虚拟机认为两个'1'字符串不是同一个对象,就返回false了。所以,这你就忽略就好了。。

    balas
    0
  • 怪我咯

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

    根据算数运算符解析顺序是=在==之前的
    所以先解析result = u.getId(),赋值运算结果为布尔true
    于是就是true==“1” 你应该研究true是否等于“1”这个话题。理论上是fasle。
    “1”是字符串不是int 1,而int 1确实可以表示成布尔类型true

    balas
    0
  • PHP中文网

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

    如果你要比较的字符串都是数字的话可以用Integer.parse转化一下。

    balas
    0
  • Batalbalas