为什么直接用==比较字符串会出错?
直接用==
比较两个字符串会出错,因为==
测试引用相等性(它们是否是同一个对象)。而要用.equals()
测试值是否相等(它们是否包含相同的数据)。
Objects.equals()在调用之前会进行null
检查,直接调用一个对象的.equals()
方法,需要先判断这个对象是否为null。
因此,如果您想测试两个字符串是否具有相同的值,您可能需要使用Objects.equals()
。
// These two have the same value
new String("test").equals("test") // --> true
// ... but they are not the same object
new String("test") == "test" // --> false
// ... neither are these
new String("test") == new String("test") // --> false
// ... but these are because literals are interned by
// the compiler and thus refer to the same object
"test" == "test" // --> true
// ... string literals are concatenated by the compiler
// and the results are interned.
"test" == "te" + "st" // --> true
// ... but you should really just call Objects.equals()
Objects.equals("test", new String("test")) // --> true
Objects.equals(null, "test") // --> false
Objects.equals(null, null) // --> true
来自 Java 语言规范JLS 15.21.3。参考相等运算符==
和!=
:
虽然
==
可用于比较 类型的引用String
,但这种相等性测试可确定两个操作数是否引用同一个String
对象。结果是,false
如果操作数是不同的String
对象,即使它们包含相同的字符序列(§3.10.5、§3.10.6 )。可以通过方法调用 测试两个字符串s
和的内容是否相等。t
s.equals(t)
您几乎总是想使用Objects.equals()
。在极少数情况下,当您知道您正在处理内部字符串时,您可以使用==
。
此外,字符串文字始终引用类的同一实例。这是因为字符串文字(或更一般地说,作为常量表达式 ( §15.28
String
)值的字符串)被“驻留”,以便使用方法共享唯一实例。String.intern
在JLS 3.10.5-1中也可以找到类似的例子。
其他可考虑的方法
String.equalsIgnoreCase()忽略大小写,判断值相等。但请注意,此方法在各种与语言环境相关的情况下可能会产生意外结果,请参阅此问题。
String.contentEquals()将 的内容String
与 any 的内容进行比较CharSequence
(自 Java 1.5 开始可用)。这样您就不必在进行相等性比较之前将 StringBuffer 等转换为 String,而将空值检查留给您。