我知道==在比较两个字符串时有一些问题。String.equals()似乎是一种更好的方法。嗯,我正在做JUnit测试,我倾向于使用assertEquals(str1, str2)。这是断言两个字符串包含相同内容的可靠方法吗?我将使用assertTrue(str1.equals(str2)),但这样您就无法看到失败时的预期值和实际值。
在相关的说明中,是否有人有一个页面或线程的链接,可以清楚地解释str1 == str2的问题?
我知道==在比较两个字符串时有一些问题。String.equals()似乎是一种更好的方法。嗯,我正在做JUnit测试,我倾向于使用assertEquals(str1, str2)。这是断言两个字符串包含相同内容的可靠方法吗?我将使用assertTrue(str1.equals(str2)),但这样您就无法看到失败时的预期值和实际值。
在相关的说明中,是否有人有一个页面或线程的链接,可以清楚地解释str1 == str2的问题?
当前回答
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);
}
}
其他回答
在Java中比较字符串时,应该始终使用.equals()。
JUnit调用.equals()方法来确定方法assertEquals(Object o1, Object o2)中的相等性。
因此,使用assertEquals(string1, string2)绝对是安全的。(因为字符串是对象)
这里有一个链接到一个很棒的Stackoverflow问题,关于==和.equals()之间的一些差异。
是的,它一直被用于测试。测试框架很可能使用.equals()来进行这样的比较。
下面是一个解释“字符串相等错误”的链接。从本质上讲,Java中的字符串是对象,当比较对象是否相等时,通常是根据内存地址进行比较,而不是根据内容。因此,即使两个字符串的内容相同,它们也不会占用相同的地址,因此即使打印时看起来相同,它们也不会正确匹配。
http://blog.enrii.com/2006/03/15/java-string-equality-common-mistake/
简而言之,你可以有两个String对象,它们包含相同的字符,但是不同的对象(在不同的内存位置)。==操作符检查两个引用是否指向同一个对象(内存位置),但equals()方法检查字符是否相同。
通常,您感兴趣的是检查两个string是否包含相同的字符,而不是它们是否指向相同的内存位置。
==运算符检查两个对象是否完全相同。
http://leepoint.net/notes-java/data/strings/12stringcomparison.html
String在java中是一个对象,所以它属于比较规则的范畴。
JUnit assertEquals(obj1, obj2)确实调用了obj1.equals(obj2)。
还有assertSame(obj1, obj2),它做obj1 == obj2(即,验证obj1和obj2引用相同的实例),这是你试图避免的。
所以你没事。