到目前为止,我一直在程序中使用==运算符来比较所有的字符串。 然而,我遇到了一个错误,将其中一个改为.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(),每次都会创建一个新对象。

其他回答

Java中的字符串是不可变的。这意味着每当您尝试更改/修改字符串时,都会得到一个新实例。你不能改变原来的字符串。这样做是为了缓存这些字符串实例。典型的程序包含大量字符串引用,缓存这些实例可以减少内存占用并提高程序的性能。

当使用==运算符进行字符串比较时,您不是在比较字符串的内容,而是在比较内存地址。如果两者相等,则返回true,否则返回false。而字符串中的equals则比较字符串内容。

问题是,如果所有字符串都缓存在系统中,为什么==返回false,而==返回true?这是可能的。如果你创建一个新的字符串,比如string str = new string ("Testing"),你最终会在缓存中创建一个新的字符串,即使缓存中已经包含了一个具有相同内容的字符串。总之,"MyString" == new String("MyString")将总是返回false。

Java还讨论了intern()函数,该函数可用于字符串,使其成为缓存的一部分,因此"MyString" == new string ("MyString").intern()将返回true。

注意:==操作符比equals快得多,因为您比较的是两个内存地址,但您需要确保代码没有在代码中创建新的String实例。否则会遇到bug。

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

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

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

如果你像我一样,当我第一次开始使用Java时,我想使用“==”操作符来测试两个String实例是否相等,但无论如何,这不是在Java中正确的方法。

在本教程中,我将演示几种不同的正确比较Java字符串的方法,从我最常用的方法开始。在本Java字符串比较教程的最后,我还将讨论为什么“==”操作符在比较Java字符串时不起作用。

选项1:使用equals方法进行Java字符串比较 大多数时候(可能是95%的时间),我用Java String类的equals方法比较字符串,像这样:

if (string1.equals(string2))

String equals方法查看两个Java字符串,如果它们包含完全相同的字符串,则认为它们相等。

看一下一个使用equals方法的快速字符串比较示例,如果运行下面的测试,两个字符串不会被认为是相等的,因为字符不完全相同(字符的大小写不同):

String string1 = "foo";
String string2 = "FOO";

if (string1.equals(string2))
{
    // this line will not print because the
    // java string equals method returns false:
    System.out.println("The two strings are the same.")
}

但是,当两个字符串包含完全相同的字符串时,equals方法将返回true,如下例所示:

String string1 = "foo";
String string2 = "foo";

// test for equality with the java string equals method
if (string1.equals(string2))
{
    // this line WILL print
    System.out.println("The two strings are the same.")
}

选项2:使用equalsIgnoreCase方法进行字符串比较

在一些字符串比较测试中,您可能希望忽略字符串是大写还是小写。当你想以这种不区分大小写的方式测试字符串是否相等时,使用String类的equalsIgnoreCase方法,如下所示:

String string1 = "foo";
String string2 = "FOO";

 // java string compare while ignoring case
 if (string1.equalsIgnoreCase(string2))
 {
     // this line WILL print
     System.out.println("Ignoring case, the two strings are the same.")
 }

选项3:使用compareTo方法进行Java字符串比较

还有第三种比较Java字符串的不太常见的方法,那就是使用String类的compareTo方法。如果两个字符串完全相同,compareTo方法将返回0(零)的值。下面是这个String比较方法的一个快速示例:

String string1 = "foo bar";
String string2 = "foo bar";

// java string compare example
if (string1.compareTo(string2) == 0)
{
    // this line WILL print
    System.out.println("The two strings are the same.")
}

当我在写Java中的这个相等概念时,有一点很重要:Java语言在基本Java Object类中包含了一个equals方法。每当您创建自己的对象,并且希望提供一种方法来查看对象的两个实例是否“相等”时,您应该在类中重写(并实现)这个equals方法(与Java语言在String equals方法中提供这种相等/比较行为的方式相同)。

你可能想看一下==,.equals(), compareTo()和compare()

在Java中,当使用==运算符比较两个对象时,它会检查两个对象是否指向内存中的相同位置。换句话说,它检查两个对象名称是否基本上引用了相同的内存位置。

Java String类实际上重写了Object类中的默认equals()实现——它重写了该方法,以便它只检查字符串的值,而不检查它们在内存中的位置。 这意味着如果调用equals()方法来比较两个String对象,那么只要实际的字符序列相等,两个对象就被认为是相等的。

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

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

==比较对象的引用值,而java.lang.String类中的equals()方法比较String对象的内容(与另一个对象)。