我知道, ==
比较两个时有一些问题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
?
你应该总是用.equals()
比较时Strings
中的Java。
JUnit的调用.equals()
方法来确定在该方法中平等assertEquals(Object o1, Object o2)
所以,你是绝对安全使用assertEquals(string1, string2)
。 (由于String
s为Object
S)
这是一个伟大的问题#1的链接对于一些之间的区别==
和.equals()
assertEquals
使用equals
用于比较方法。 有一个不同的断言, assertSame
,它使用==
操作符。
要理解为什么==
不应该与你需要了解什么字符串中使用==
做:它的身份检查。 也就是说, a == b
检查是否a
和b
是指相同的对象 。 它是建立在语言,其行为不能由不同类别的改变。 所述equals
方法,在另一方面,可通过类覆盖。 尽管(在其默认行为Object
类)是用做一个身份检查==
操作符,很多类,包括String
,覆盖它,而不是做一个“对等”的检查。 在的情况下, String
而不是检查如果a
和b
是指相同的对象, a.equals(b)
进行检查以查看它们是否指的对象是含有完全相同的字符两个字符串。
打个比方时间:想象,每个String
对象是一张纸,上面写有一些东西。 比方说,我有两张纸与“富”写就的,而另一个与“酒吧”写在上面。 如果我拿第一纸两个部分,并使用==
来比较它们将返回false
,因为它本质上是问:“这些都是同一张纸吗?”。 它并不需要连看什么写在纸上。 那我给它的两张纸(而不是同一个两次),这意味着它会返回false
。 如果我使用equals
,但是, equals
方法将读取的两张纸,看看他们说同样的事情(“富”),所以它会返回true
。
是它和字符串混乱的一点是,在Java有“实习”字符串的一个概念,这就是(有效),在你的代码中的任何字符串字面量自动执行。 这意味着,如果你在你的代码的两个等价的字符串(即使他们在不同的班级),他们会实际上都指向同一个String
对象。 这使得==
操作符返回true
往往比人们所预料。
概括地说 - 你可以有一个包含相同字符,但不同的对象(在不同的存储位置)两个String对象。 ==操作符进行检查以查看该两个引用都指向相同的对象(存储位置),但equals()方法检查是否字符是相同的。
通常你有兴趣的检查,如果两个字符串包含相同的字符,它们不是是否指向同一个内存位置。
是的,它是用来所有的时间进行测试。 这是非常有可能的是,测试框架使用.equals()进行比较,这样的人。
下面是一个链接解释“字符串相等错误”。 从本质上讲,在Java字符串是对象,当你比较的对象相等,它们通常是基于内存地址进行比较,而不是内容。 正因为如此,两个字符串不会占用同一个地址,即使他们的内容是相同的,所以他们不会正确地匹配,即使他们看起来是一样的打印时。
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
(即验证obj1
和obj2
引用的是相同的实例),这是你想躲避什么。
所以,你的罚款。
“的
==
操作符检查,看看如果两个Objects
是完全一样的Object
。”
http://leepoint.net/notes-java/data/strings/12stringcomparison.html
String
是一个Object
在Java中,所以它属于比较规则的范畴。