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

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


当前回答

我认为当你定义一个字符串时,你就定义了一个对象。所以你需要使用。equals()。当你使用基本数据类型时,你可以使用==,但对于String(和任何对象),你必须使用.equals()。

其他回答

String a = new String("foo");
String b = new String("foo");
System.out.println(a == b); // prints false
System.out.println(a.equals(b)); // prints true

确保你明白其中的原因。这是因为==比较只比较引用;equals()方法对内容逐字符进行比较。

当你为a和b调用new时,每一个都得到一个指向字符串表中的“foo”的新引用。参考文献不同,但内容是一样的。

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

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

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

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

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。

我认为当你定义一个字符串时,你就定义了一个对象。所以你需要使用。equals()。当你使用基本数据类型时,你可以使用==,但对于String(和任何对象),你必须使用.equals()。

所有对象都保证有一个.equals()方法,因为Object包含一个返回布尔值的方法。equals()。如果需要进一步的定义,子类的工作就是重写这个方法。如果没有它(即使用==),则只检查两个对象之间的内存地址是否相等。String重写了这个.equals()方法,它没有使用内存地址,而是返回字符级别的字符串的相等性比较。

A key note is that strings are stored in one lump pool so once a string is created it is forever stored in a program at the same address. Strings do not change, they are immutable. This is why it is a bad idea to use regular string concatenation if you have a serious of amount of string processing to do. Instead you would use the StringBuilder classes provided. Remember the pointers to this string can change and if you were interested to see if two pointers were the same == would be a fine way to go. Strings themselves do not.