关于java:如何比较两个字符串的值是否相等,最好的方法是什么?

How to compare two strings are equal in value, what is the best method?

本问题已经有最佳答案,请猛点这里访问。

总是对这件事感到困惑。有人能帮忙吗?


方法是string1.equals(string2)

如果string1等于string2的值,则返回true。否则,它将返回false

等于引用


string1.equals(string2)是正确的方法。

1
2
3
4
5
6
7
8
String s ="something", t ="maybe something else";
 if (s == t)      // Legal, but usually results WRONG.
 if (s.equals(t)) // RIGHT way to check the two strings
  /* == will fail in following case:*/
 String s1 = new String("abc");
 String s2 = new String("abc");

 if(s1==s2) //it will return false


您可以使用==运算符或object.equals(object)方法。

==运算符检查两个主题是否是同一对象,而equals方法检查内容(长度和字符)是否相等。

1
2
3
4
5
6
7
if(objectA == objectB) {
   // objects are the same instance. i.e. compare two memory addresses against each other.
}

if(objectA.equals(objectB)) {
   // objects have the same contents. i.e. compare all characters to each other
}

你选择哪一个取决于你的逻辑-使用==如果你能并且等于如果你不关心性能,无论如何它是相当快的。

string.intern()如果您有两个字符串,您可以将它们实习,即让JVM创建一个字符串池,并返回与池实例相等的实例(通过调用string.intern())。这意味着,如果有两个字符串,则可以对两者都调用string.intern(),然后使用==运算符。不过,string.intern()的成本很高,应该只作为一种优化——它只对多次比较有好处。

但是,所有的代码字符串都已被实习,因此如果不创建新的字符串,您可以自由使用==运算符。总的来说,你在

1
2
3
if(objectA == objectB || objectA.equals(objectB)) {

}

如果你把这两种情况混为一谈。内联

1
2
3
if(objectA == null ? objectB == null : objectA.equals(objectB)) {

}

也非常有用,它还处理空值,因为string.equals(..)检查空值。


您应该使用某种形式的String#equals(Object)方法。但是,您应该如何做到这一点有一些微妙之处:

如果您有一个字符串文字,那么您应该这样使用它:

1
"Hello".equals(someString);

这是因为字符串文字"Hello"不能为空,所以您将永远不会碰到NullPointerException

如果您有一个字符串和另一个对象,那么应该使用:

1
myString.equals(myObject);

这样做可以确保字符串相等。据你所知,myObject可以是一个类,它总是在其equals方法中返回true

从不太可能为空的对象开始,因为:

1
2
3
String foo = null;
String bar ="hello";
foo.equals(bar);

会抛出一个NullPointerException,但这:

1
2
3
String foo = null;
String bar ="hello";
bar.equals(foo);

不会。当参数为空时,String#equals(Object)将正确处理这种情况,因此您只需要担心要取消引用的对象——第一个对象。


==检查它们是否实际上是内存中的同一个对象(有时会令人困惑,因为它们可能都来自池),其中equals()java.lang.String重写,以检查每个字符以确保真正的相等。因此,你想要的是equals()


别忘了

1
.equalsIgnoreCase(String)

如果你不担心那种事…