我知道 == 在比较两个 Strings 时会遇到一些问题。似乎 String.equals()是一种更好的方法。好吧,我正在进行JUnit测试,我倾向于使用 assertEquals(str1,str2)。这是断言两个字符串包含相同内容的可靠方法吗?我会使用 assertTrue(str1.equals(str2)),但是你不会看到失败时预期值和实际值的好处。

在相关的说明中,是否有人有一个链接到一个页面或线程,明确地解释了 str1 == str2 的问题?

有帮助吗?

解决方案

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

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

因此,使用 assertEquals(string1,string2)绝对安全。 (因为 String s是 Object s)

这是一个很棒的Stackoverflow问题的链接关于 == .equals()之间的一些区别。

其他提示

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

要理解为什么 == 不应该与字符串一起使用,您需要了解 == 的作用:它会进行身份检查。也就是说, a == b 检查 a b 是否引用同一对象。它内置于语言中,其行为不能被不同的类更改。另一方面, equals 方法可以被类覆盖。虽然它的默认行为(在 Object 类中)是使用 == 运算符进行身份检查,但许多类(包括 String )都会覆盖它改为做“等价”。校验。对于 String ,不是检查 a b 是否引用同一个对象, a.equals(b)检查它们引用的对象是否都是包含完全相同字符的字符串。

类比时间:想象一下,每个 String 对象都是一张纸,上面写着一些东西。假设我有两张带有“Foo”的纸。写在他们身上,另一个写在“Bar”上。写在上面。如果我拿前两张纸并使用 == 来比较它们,它将返回 false ,因为它实质上是在询问“这些纸张是否相同?” 。它甚至不需要查看纸上写的内容。事实上,我给它两张纸(而不是相同的两张纸)意味着它将返回 false 。但是,如果我使用 equals ,那么 equals 方法会读取两张纸并看到它们说同样的东西(“Foo”),所以它' ll返回 true

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

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

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

是的,它一直用于测试。测试框架很可能使用.equals()进行比较,例如这些。

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

http://blog.enrii。 COM / 2006/03/15 / java的字符串平等-共错误/

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 (即验证 obj1 obj2 引用相同的实例),这是你要避免的。

所以你没事。

  

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top