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