到目前为止,我一直在程序中使用==运算符来比较所有的字符串。 然而,我遇到了一个错误,将其中一个改为.equals(),它修复了这个错误。

==不好吗?什么时候应该使用,什么时候不应该使用?有什么不同?


当前回答

如果equals()方法出现在java.lang.Object类中,并且希望它检查对象状态的等价性!也就是说,对象的内容。而==运算符则用于检查实际的对象实例是否相同。

例子

考虑两个不同的参考变量str1和str2:

str1 = new String("abc");
str2 = new String("abc");

如果你使用equals()

System.out.println((str1.equals(str2))?"TRUE":"FALSE");

如果使用==,您将得到TRUE的输出。

System.out.println((str1==str2) ? "TRUE" : "FALSE");

现在您将得到FALSE作为输出,因为str1和str2都指向两个不同的对象,尽管它们共享相同的字符串内容。因为有了new String(),每次都会创建一个新对象。

其他回答

是的,==不利于比较字符串(实际上是任何对象,除非您知道它们是规范的)。==只是比较对象引用。.equals()测试是否相等。对于字符串,它们通常是相同的,但正如你所发现的,这并不总是保证的。

==测试对象引用,.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";

但是要小心空值!

==可以处理空字符串,但从空字符串调用.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:

System.out.print("bar".equals(fooString1));  // "bar" is never null
System.out.print(Objects.equals(fooString1, "bar"));  // Java 7 required

==比较Java中的对象引用,String对象也不例外。

为了比较对象(包括String)的实际内容,必须使用equals方法。

如果使用==对两个String对象进行比较的结果为真,那是因为String对象被合并了,并且Java虚拟机有多个引用指向同一个String实例。不要期望使用==比较一个包含相同内容的String对象与另一个String对象的计算结果为true。

==操作符检查两个字符串是否完全相同的对象。

equals()方法将检查两个字符串是否具有相同的值。

.equals()比较类中的数据(假设函数已经实现)。 ==比较指针位置(对象在内存中的位置)。

==如果两个对象(不是谈论原语)指向同一个对象实例,则返回true。 .equals()如果两个对象包含相同的数据,则返回true

那可能对你有帮助。