我知道==
比较两个时会有一些问题Strings
。看来这String.equals()
是一个更好的方法。好吧,我正在进行JUnit测试,而我倾向于使用assertEquals(str1, str2)
。这是断言两个字符串包含相同内容的可靠方法吗?我会使用assertTrue(str1.equals(str2))
,但是那样的话,您将无法获得预期的失败值和实际值。
在相关说明中,是否有人链接到页面或线程以清楚地解释问题所在str1 == str2
?
我知道==
比较两个时会有一些问题Strings
。看来这String.equals()
是一个更好的方法。好吧,我正在进行JUnit测试,而我倾向于使用assertEquals(str1, str2)
。这是断言两个字符串包含相同内容的可靠方法吗?我会使用assertTrue(str1.equals(str2))
,但是那样的话,您将无法获得预期的失败值和实际值。
在相关说明中,是否有人链接到页面或线程以清楚地解释问题所在str1 == str2
?
Answers:
在Java中进行比较时应始终使用。.equals()
Strings
JUnit调用该.equals()
方法以确定方法中的相等性assertEquals(Object o1, Object o2)
。
因此,您绝对可以放心使用assertEquals(string1, string2)
。(因为String
s是Object
)
这是一个关于Stackoverflow问题的链接,该问题涉及==
和之间的一些差异.equals()
。
assertEquals
使用该equals
方法进行比较。有一个不同的assert assertSame
,它使用==
运算符。
要了解为什么==
不应该将字符串与字符串一起使用,您需要了解==
它的作用:它将进行身份检查。也就是说,a == b
检查是否a
与b
指同一个对象。它是语言的内置语言,其行为不能由不同的类更改。equals
另一方面,该方法可以被类覆盖。尽管它的默认行为(在Object
该类中)是使用==
运算符进行身份检查,但许多类(包括)都对其进行了String
覆盖,以进行“等效性”检查。在的情况下String
,除了检查a
和b
引用相同的对象外,a.equals(b)
检查它们所引用的对象是否都是包含完全相同字符的字符串。
比喻时间:想象每个String
对象都是一张纸,上面写着一些东西。假设我有两张纸,上面写有“ Foo”,另一张纸上写有“ Bar”。如果我将前两张纸==
用于比较,它将返回,false
因为它本质上是在问“这些纸是同一张纸吗?”。它甚至不需要查看纸上写的内容。我给它两张纸(而不是同一张纸两次)的事实意味着它将会返回false
。equals
但是,如果我使用该equals
方法,则该方法将读取两张纸,并看到它们说的是同一句话(“ Foo”),因此它将返回true
。
与String混淆的一点是Java具有“ interning”字符串的概念,并且(有效地)对代码中的任何字符串文字自动执行。这意味着,如果您的代码中有两个等效的字符串文字(即使它们位于不同的类中),则它们实际上都将引用同一String
对象。这使==
操作员返回的true
次数比预期的要多。
是的,它一直用于测试。测试框架很有可能使用.equals()进行此类比较。
以下是解释“字符串相等错误”的链接。本质上,Java中的字符串是对象,当您比较对象相等性时,通常根据内存地址而不是内容进行比较。因此,即使它们的内容相同,两个字符串也不会占用相同的地址,即使它们在打印时看起来相同,也不会正确匹配。
http://blog.enrii.com/2006/03/15/java-string-equality-common-mistake/
“
==
操作员检查两个Objects
是否完全相同Object
。”
http://leepoint.net/notes-java/data/strings/12stringcomparison.html
String
是Object
Java中的,因此它属于比较规则的类别。