问题:在Java 里面怎么比较字符串
到目前为止,我使用== 操作符去比较字符串在我的程序里面。然而,却产生了一个bug,将这个改为了.equals()以后,就把bug修复了
==是不是太辣鸡了?它什么时候应该被使用或者说是不是不应该再用了。它们之间的差别是什么?
回答一
==判断的是引用是不是相等(就是它们是不是同一个对象)
.equals()判断的是它们的值是不是相等的(就是它们逻辑上是不是等价的)
Objects.equals()在调用calling .equals() 前,先检查对象是不是为空,所以这些检查你是不需要做的。(在JDK7以后和Guava里面也是可以这样用的)
因此,如果你需要判断两个字符串是否有相同的值,你可以使用Objects.equals()方法
// 它们两个的值是否相等
new String("test").equals("test") // --> true // 但是它们不是同一个对象
new String("test") == "test" // --> false //
new String("test") == new String("test") // --> false // 但是因为这些字面常量是被编译器放在常量池内部的,因此是同一个对象
"test" == "test" // --> true // 字符串字面常量被编译器连接起来了,因此这个字符串也是被内置在常量池里的
"test" == "te" + "st" // --> true//但是你更应该直接调用Objects.equals方法
Objects.equals("test", new String("test")) // --> true
Objects.equals(null, "test") // --> false
Objects.equals(null, null) // --> true
你几乎都是会用Objects.equals()。但是在极少数的情况下,你知道你在处理的是常量池里面的字符串的,你就可以用==
从JLS 3.10.5.起,string字面常量:
此外,一个string字面常量总是引用相同的string类的实例的。这是因为string字面常量,或者更通常来说应该是作为常量表达式值的字符串 通过使用String.intern方法,内置在了常量池中,为了去共享一个唯一的实例
相似的例子可以在JLS 3.10.5-1里面找到
文章翻译自Stack Overflow:https://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java