在Java中,我为字符串trim()方法编写了以下代码。
if(" String ".trim() == "String")
System.out.println("Equal");
else
System.out.println("Not Equal");
它给出了我理解的输出Not Equal
,因为" String ".trim()
返回了新的String
对象引用。
但是当我在没有空格的情况下修剪和比较时,它会给出输出Equals
.
if("String".trim() == "String")
System.out.println("Equal");
else
System.out.println("Not Equal");
如果字符串没有空格trim()
该方法返回什么?我知道我可以使用equals()
,但在考试中我得到了这个问题。
你看过 API 吗?这在trim()
方法的文档中有明确说明:
返回:此字符串的副本,带有前导和尾随空格 已删除,或者此字符串(如果它没有前导或尾随空格)。
您也可以浏览源代码。如果两端没有删除空格,则trim()
方法返回this
public String trim() {
int len = value.length;
int st = 0;
char[] val = value; /* avoid getfield opcode */
while ((st < len) && (val[st] <= ' ')) {
st++;
}
while ((st < len) && (val[len - 1] <= ' ')) {
len--;
}
return ((st > 0) || (len < value.length)) ? substring(st, len) : this;
}
因此,如果 st > 0
和 len < value.length
都是假的(对于两端没有空格的字符串来说就是这种情况),它将返回 this
。
现在,"String" == "String"
之所以true
,是因为字符串实习。您可以通过谷歌获得有关此的更多信息。
如果 trim()
方法不执行任何操作(因为字符串已被修剪),则返回相同的字符串对象(即 this
)。
实习意味着字符串常量"String"与在整个代码中使用"String"的地方使用的完全相同的对象。
这两个事实加在一起就是为什么==
对于"String".trim() == "String"
的比较是正确的。
==
运算符检查它是否是同一个对象。若要比较对象的相等性,请使用.equals()
方法。在第二种情况下,没有空格的字符串不会对对象执行任何操作。因此它是相等的,因为对象是相同的。