我尝试在java中运行以下代码:
if("hello".trim() == "hello".trim())
System.out.println("Equal");
else
System.out.println("Not Equal");
并打印出Equal。我理解在这种情况下两个字符串都有相同的参考。但是当我通过在两个字符串中添加空格来尝试相同时,它会打印“Not Equal”。
if("hello ".trim() == "hello ".trim())
System.out.println("Equal");
else
System.out.println("Not Equal");
任何人都可以解释为什么我会“不等于”......?
答案 0 :(得分:16)
只需查看trim
的实施情况,您就会明白这一点。如果trim
确定该字符串没有前导/尾随空格,则返回相同的字符串 - 这是您的第一种情况。在第二种情况下,创建一个新字符串,因此您有两个相等的String实例,每个实例都有自己的标识。并且,正如我认为你知道的那样,operator ==比较引用而不是对象,因此它不关心这两个实例是否代表相同的字符串。
答案 1 :(得分:6)
此行为在JavaDoc of trim()
(大胆矿)中描述:
此字符串的副本已删除前导和尾随空格,或此字符串(如果没有前导或尾随空格)。
从实施中也很清楚:
public String trim() {
//...
return ((st > 0) || (len < count)) ? substring(st, len) : this;
}
如果发现某些前导或尾随空格,则会调用substring()
返回新的String
。否则会返回this
。
有趣的事实:在两种情况下(如果返回this
并且调用substring()
时)返回的对象指向相同的原始char[]
数组。仅包装String
对象发生更改,数组索引选择该数组的子集。
答案 2 :(得分:3)
if("hello".trim() == "hello".trim())
这里你的字符串实际上没有被修改过.. 而在第二种情况下: -
if("hello ".trim() == "hello ".trim())
您正在修改字符串..并且两个字符串都会创建不同的对象..
虽然,如果您尝试使用equals()
方法对它们进行比较,您将获得所需的结果。由于equals()
方法比较两个字符串的内容,而==
比较参考..
因此,当使用==
比较具有相同内容的两个不同字符串对象时,您实际上是在比较那些不同的字符串reference
。
答案 3 :(得分:1)
来自文档 - Trim:
&#34;如果此String对象表示空字符序列,或者此String对象表示的字符序列的第一个和最后一个字符的代码都大于&#39; \ u0020&#39; (空格字符),然后返回对此String对象的引用。&#34;
(在你的第一个例子的情况下,你得到相同的参考)
&#34;否则,让k为代码大于&#39; \ u0020&#39;的字符串中第一个字符的索引,让m为字符串中最后一个字符的索引代码大于&#39; \ u0020&#39;创建一个新的String对象,表示该字符串的子字符串,以索引k处的字符开头,以索引m处的字符结尾,即this.substring(k,m + 1)的结果。&#34 ;
(因此,创建了两个新字符串,由于内存中的两个对象不同,因此判断返回false)
为了将来参考,您可以这样做:if ("hello ".trim().equals("hello ".trim()))
检查两个字符串的内容是否相等。