Android Studio中Java字符串==比较结果异常原因咨询
为什么内容相同的字符串用
==比较返回false? 这是Java里非常常见的新手误区,我给你把这个事儿说透:
在Java中,String属于引用类型,和int、boolean这类基本数据类型不一样。当你用==比较引用类型时,它根本不会去看字符串的实际内容——它比较的是两个对象在内存中的引用地址。
你调试时看到TakeText="WoW"、Text1="WoW",但这俩字符串大概率是不同的对象实例:
TakeText是通过startBox.getText().toString()得到的,这个方法会在堆内存里生成一个新的String对象,它的引用指向这个新位置Text1如果是直接用双引号定义的常量,它的引用会指向Java的字符串常量池里的位置;哪怕不是常量,只要和TakeText的创建路径不同,引用地址就可能不一样
所以哪怕内容完全一致,只要它们的内存引用地址不重合,==就会返回false。
正确的字符串内容比较方式
要比较字符串的实际内容,你得用专门的方法:
- 使用
equals()方法:这是String类原生用来比较内容的方法
要是if (marker == null && TakeText.equals(Text1)) { ... }TakeText有可能为null,建议把常量放前面,避免空指针异常:if (marker == null && Text1.equals(TakeText)) { ... } - 使用
Objects.equals()(Java 7及以上可用):这个方法会自动处理null的情况,不用额外担心空指针import java.util.Objects; // ... if (marker == null && Objects.equals(TakeText, Text1)) { ... }
补充:为啥有时候==又能生效?
如果两个字符串都是直接用双引号声明的常量(比如String a = "WoW"; String b = "WoW";),这时候a == b会返回true——因为Java会把字符串常量放进字符串常量池,相同内容的常量会复用同一个引用。但只要是通过new String()、toString()(部分场景)等方式创建的字符串,就会在堆内存生成新对象,==就失效了。
内容的提问来源于stack exchange,提问作者Mark Caveneau
相关产品推荐
相关产品推荐

