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)
。 (因为String
是Object
)
这里是一个很好的关于==
和.equals()
之间差异的很好的Stackoverflow问题的链接 。
assertEquals
使用equals
方法进行比较。 有一个不同的assert, assertSame
,它使用==
运算符。
要理解为什么==
不应该与string一起使用,您需要了解==
作用:它执行身份检查。 也就是说, a == b
检查a
和b
指向同一个对象 。 它是build立在语言之上的,它的行为不能被不同的类别所改变。 另一方面, equals
方法可以被类重写。 虽然它的缺省行为(在Object
类中)是使用==
运算符进行身份检查,但许多类(包括String
)都会覆盖它,而不是执行“等同性”检查。 在String
的情况下, a.equals(b)
不是检查a
和b
引用同一个对象, 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
(即,validationobj1
和obj2
引用相同的实例),这是你想要避免的。
所以你很好。
“
==
运算符检查两个Objects
是否完全相同的Object
。”
http://leepoint.net/notes-java/data/strings/12stringcomparison.html
String
是java中的一个Object
,因此属于这种比较规则的类别。