到目前为止,我一直在程序中使用==运算符来比较所有的字符串。 然而,我遇到了一个错误,将其中一个改为.equals(),它修复了这个错误。
==不好吗?什么时候应该使用,什么时候不应该使用?有什么不同?
到目前为止,我一直在程序中使用==运算符来比较所有的字符串。 然而,我遇到了一个错误,将其中一个改为.equals(),它修复了这个错误。
==不好吗?什么时候应该使用,什么时候不应该使用?有什么不同?
当前回答
您还可以使用compareTo()方法来比较两个string。如果compareTo结果为0,则两个字符串相等,否则被比较的字符串不相等。
==比较引用,不比较实际字符串。如果你确实使用new string (somestring).intern()创建了每个字符串,那么你可以使用==操作符来比较两个字符串,否则只能使用equals()或compareTo方法。
其他回答
是的,很糟糕……
==表示两个字符串引用是完全相同的对象。您可能听说过这种情况,因为Java保留了某种文字表(它确实如此),但情况并非总是如此。一些字符串以不同的方式加载,从其他字符串构造,等等,所以永远不要假设两个相同的字符串存储在相同的位置。
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()方法出现在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()测试是否相等。对于字符串,它们通常是相同的,但正如你所发现的,这并不总是保证的。