Java:是assertEquals(String,String)可靠吗?

我知道==比较两个Strings时有一些问题。 看来, String.equals()是一个更好的方法。 那么,我正在做JUnittesting,我的倾向是使用assertEquals(str1, str2) 。 这是一个可靠的方式来断言两个string包含相同的内容? 我会使用assertTrue(str1.equals(str2)) ,但是你没有看到失败的预期和实际值的好处。

在相关的说明,没有人有一个页面或线程的链接,清楚地解释str1 == str2的问题?

在比较Java中的Strings时,应该总是使用.equals()

JUnit调用.equals()方法来确定方法assertEquals(Object o1, Object o2)相等性。

所以,你绝对安全使用assertEquals(string1, string2) 。 (因为StringObject

这里是一个很好的关于==.equals()之间差异的很好的Stackoverflow问题的链接 。

assertEquals使用equals方法进行比较。 有一个不同的assert, assertSame ,它使用==运算符。

要理解为什么==不应该与string一起使用,您需要了解==作用:它执行身份检查。 也就是说, a == b检查ab指向同一个对象 。 它是build立在语言之上的,它的行为不能被不同的类别所改变。 另一方面, equals方法可以被类重写。 虽然它的缺省行为(在Object类中)是使用==运算符进行身份检查,但许多类(包括String )都会覆盖它,而不是执行“等同性”检查。 在String的情况下, a.equals(b)不是检查ab引用同一个对象, a.equals(b)检查它们引用的对象是否都包含完全相同字符的string。

比喻时间:假设每个String对象都是一张纸上写着的东西。 假设我有两张写有“Foo”的纸,另一张写着“Bar”。 如果我拿第一张两张纸,并用==来比较它们,它将返回false因为它本质上是要求“这些是同一张纸吗?”。 甚至不需要看文件上的内容。 事实上,我给了它两张纸(而不是两次同一个)意味着它将返回false 。 但是,如果我使用equals ,那么equals方法会读取两张纸,并看到他们说的是相同的东西(“Foo”),所以它会返回true

与Strings混淆的一点是,Java有一个“interning”string的概念,这是(有效)自动执行在您的代码中的任何string文字。 这意味着如果你的代码中有两个等价的string文字(即使它们在不同的类中),它们实际上都会引用同一个String对象。 这使得==运算符比预期的更频繁地返回true

简而言之,您可以拥有两个包含相同字符但不同对象(位于不同内存位置)的String对象。 ==运算符检查两个引用指向同一个对象(内存位置),但equals()方法检查这些字符是否相同。

通常你有兴趣检查两个string是否包含相同的字符,而不是指向相同的内存位置。

是的,它一直用于testing。 testing框架很可能使用.equals()进行比较。

以下是解释“string平等错误”的链接。 本质上,Java中的string是对象,当比较对象相等性时,通常会根据内存地址而不是内容进行比较。 因此,即使两个string的内容相同,它们也不会占用相同的地址,即使它们在打印时看起来相同,也不会正确匹配。

http://blog.enrii.com/2006/03/15/java-string-equality-common-mistake/

 public class StringEqualityTest extends TestCase { public void testEquality() throws Exception { String a = "abcde"; String b = new String(a); assertTrue(a.equals(b)); assertFalse(a == b); assertEquals(a, b); } } 

JUnit的assertEquals(obj1, obj2)确实调用obj1.equals(obj2)

还有assertSame(obj1, obj2) ,它obj1 == obj2 (即,validationobj1obj2引用相同的实例),这是你想要避免的。

所以你很好。

==运算符检查两个Objects是否完全相同的Object 。”

http://leepoint.net/notes-java/data/strings/12stringcomparison.html

String是java中的一个Object ,因此属于这种比较规则的类别。