如何比较Java中的字符串?

我一直在使用我的程序中的==运算符来比较我所有的字符串。 但是,我遇到了一个bug,将其中一个改为.equals() ,然后修复了这个bug。

==不好? 它应该什么时候它应该不被使用? 有什么不同?


==测试引用相等(不管它们是否是同一个对象)。

.equals()测试值是否相等(不管它们在逻辑上是否相等)。

Objects.equals()在调用.equals()之前检查空值,因此您不必(可从JDK7获得,也可在Guava中获得)。

因此,如果要测试两个字符串是否具有相同的值,则可能需要使用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() 。 在极少数情况下,您知道您正在处理interned字符串,您可以使用==

来自JLS 3.10.5。 字符串文字:

此外,字符串文字始终指的是String类的同一个实例。 这是因为字符串文字 - 或者更一般地说是常量表达式(§15.28)值的字符串 - 被“实施”,以便使用方法String.intern共享唯一实例。

类似的例子也可以在JLS 3.10.5-1中找到。


==测试对象引用, .equals()测试字符串值。

有时候看起来好像==比较值,因为Java做一些幕后的东西,以确保相同的行字符串实际上是同一个对象。

例如:

String fooString1 = new String("foo");
String fooString2 = new String("foo");

// Evaluates to false
fooString1 == fooString2;

// Evaluates to true
fooString1.equals(fooString2);

// Evaluates to true, because Java uses the same object
"bar" == "bar";

但要小心空位!

==处理null字符串,但是从空字符串调用.equals()会导致异常:

String nullString1 = null;
String nullString2 = null;

// Evaluates to true
System.out.print(nullString1 == nullString2);

// Throws a NullPointerException
System.out.print(nullString1.equals(nullString2));

因此,如果您知道fooString1可能为空,请通过书写告诉读者

System.out.print(fooString1 != null && fooString1.equals("bar"));

以下内容较短,但不太明显,它会检查null(来自Java 7):

System.out.print(Objects.equals(fooString1, "bar"));

==比较对象引用。

.equals()比较字符串值。

有时==会给出比较字符串值的幻想,如下例所示:

String a="Test";
String b="Test";
if(a==b) ===> true

这是因为当您创建任何字符串文字时,JVM首先在字符串池中搜索该文字,并且如果它找到匹配,那么将对该新字符串赋予相同的引用。 因此,我们得到:

(a == b)===> true

                       String Pool
     b -----------------> "test" <-----------------a

但是, ==在下列情况下失败:

String a="test";
String b=new String("test");
if (a==b) ===> false

在这种情况下,对于new String("test") ,将在堆上创建新的String语句,并且该引用将被赋予给b ,所以b将在堆中被赋予引用,而不是在String池中。

现在a指向字符串池中的字符串,而b指向堆上的字符串。 正因为如此,我们得到:

如果(a == b)===> false。

                String Pool
     "test" <-------------------- a

                   Heap
     "test" <-------------------- b

虽然.equals()总是比较String的值,所以在两种情况下它都是true:

String a="Test";
String b="Test";
if(a.equals(b)) ===> true

String a="test";
String b=new String("test");
if(a.equals(b)) ===> true

所以使用.equals()总是更好。

链接地址: http://www.djcxy.com/p/86709.html

上一篇: How do I compare strings in Java?

下一篇: my activity has leaked window and I cant find solution