-
ABOUTYOU
==测试对象引用,.equals()测试字符串值。有时它看起来好像要==比较值,因为Java会做一些幕后的东西来确保相同的内联字符串实际上是同一个对象。例如:String fooString1 = new String("foo");String fooString2 = new String("foo");
// Evaluates to falsefooString1 == fooString2;
// Evaluates to truefooString1.equals(fooString2);
// Evaluates to true, because Java uses the same object"bar" == "bar";但要注意空值!==处理null字符串很好,但从.equals()空字符串调用将导致异常:String nullString1 = null;String nullString2 = null;
// Evaluates to trueSystem.out.print(nullString1 == nullString2);
// Throws a NullPointerExceptionSystem.out.print(nullString1.equals(nullString2));因此,如果您知道fooString1可能为空,请通过写信告诉读者System.out.print(fooString1 != null && fooString1.equals("bar"));以下内容较短,但检查null(来自Java 7)不太明显:System.out.print(Objects.equals(fooString1, "bar"));
-
慕码人8056858
该==运营商检查是否两个字符串是完全相同的对象。该.equals()方法将检查两个字符串是否具有相同的值。
-
神不在的星期二
Java中的字符串是不可变的。这意味着每当您尝试更改/修改字符串时,您将获得一个新实例。您无法更改原始字符串。这样做是为了可以缓存这些字符串实例。典型的程序包含大量的字符串引用和缓存这些实例可以减少内存占用并提高程序的性能。使用==运算符进行字符串比较时,您不是在比较字符串的内容,而是实际比较内存地址。如果它们都相等,则返回true和false。而字符串中的equals则比较字符串内容。所以问题是如果所有字符串都缓存在系统中,那么如何==返回false而equals返回true?嗯,这是可能的。如果您创建一个新的字符串,就像String str = new String("Testing")您最终在缓存中创建一个新字符串,即使缓存已包含具有相同内容的字符串。总之"MyString" == new String("MyString")将永远返回虚假。Java还讨论了函数intern(),它可以在字符串上使用,使其成为缓存的一部分,因此"MyString" == new String("MyString").intern()将返回true。注意:==运算符比equals快得多,因为您要比较两个内存地址,但是您需要确保代码不在代码中创建新的String实例。否则你会遇到错误。
-
牧羊人nacy
String a = new String("foo");String b = new String("foo");System.out.println(a == b); // prints falseSystem.out.println(a.equals(b)); // prints true确保你理解为什么。这是因为==比较只比较参考文献; 该equals()方法对内容进行逐字符比较。当您拨打新a和b,每个人得到一个指向一个新的参考"foo"字符串表。引用不同,但内容相同。
-
大话西游666
是的,这很糟糕......==意味着您的两个字符串引用完全相同。您可能听说过这种情况,因为Java保留了一个文字表(它确实如此),但情况并非总是如此。某些字符串以不同的方式加载,由其他字符串等构成,因此您绝不能假设两个相同的字符串存储在同一位置。Equals为您进行真正的比较。
-
肥皂起泡泡
是的,==对于比较字符串(实际上是任何对象,除非你知道它们是规范的)是不好的。 ==只是比较对象引用。 .equals()测试平等。对于Strings来说,它们通常都是相同的,但正如你所发现的那样,总是不能保证。
-
桃花长相依
Java有一个String池,Java管理String对象的内存分配。请参阅Java中的字符串池使用==运算符检查(比较)两个对象时,它会将地址相等性与字符串池进行比较。如果两个String对象具有相同的地址引用,则返回true,否则返回false。但是,如果要比较两个String对象的内容,则必须覆盖该equals方法。equals 实际上是Object类的方法,但它被重写到String类中,并给出了一个比较对象内容的新定义。Example: stringObjectOne.equals(stringObjectTwo);但请记住它尊重String的情况。如果你想要不区分大小写,那么你必须使用String类的equalsIgnoreCase方法。让我们来看看:String one = "HELLO"; String two = "HELLO"; String three = new String("HELLO"); String four = "hello"; one == two; // TRUEone == three; // FALSEone == four; // FALSEone.equals(two); // TRUEone.equals(three); // TRUEone.equals(four); // FALSEone.equalsIgnoreCase(four); // TRUE
-
慕姐4208626
==比较Java中的对象引用,对象也不例外String。为了比较对象(包括String)的实际内容,必须使用该equals方法。如果使用的两个String对象的比较==结果是true,那是因为String对象被实现了,并且Java虚拟机有多个引用指向同一个实例String。人们不应期望将String包含相同内容的一个String对象与另一个对象进行比较==来评估为true。
-
萧十郎
我同意zacherates的回答。但你可以做的是调用intern()你的非文字字符串。从zacherates示例:// ... but they are not the same objectnew String("test") == "test" ==> false如果你实习非文字字符串相等是 truenew String("test").intern() == "test" ==> true
-
慕丝7291255
.equals()比较类中的数据(假设函数已实现)。 ==比较指针位置(对象在内存中的位置)。==如果两个对象(不是关于PRIMITIVES的对话)指向SAME对象实例,则返回true。 .equals()如果两个对象在Java中包含相同的数据Versus ,则返回trueequals()==这可能对你有帮助。