13

可能的重复:
Java 中的字符串比较和字符串实习

我尝试在java中运行以下代码:

if("hello".trim() == "hello".trim())
   System.out.println("Equal");
else
   System.out.println("Not Equal");

它打印相等。我明白在这种情况下,两个字符串都有相同的引用。但是当我通过在两个字符串中添加一个空格来尝试相同的操作时,它会打印“不等于”。

if("hello ".trim() == "hello ".trim())
   System.out.println("Equal");
else
  System.out.println("Not Equal");

谁能解释为什么我得到“不平等”......?

4

4 回答 4

16

只需检查执行情况trim,您就会清楚。如果trim确定字符串没有前导/尾随空格,则返回相同的字符串——这是您的第一种情况。在第二种情况下,创建了一个新字符串,因此您有两个相等的 String 实例,每个实例都有自己的标识。而且,我认为您知道,运算符 == 比较引用而不是对象,因此它不关心两个实例是否表示相等的字符串。

于 2012-09-30T10:00:31.660 回答
6

这种行为在(bold mine)的JavaDoc 中有描述:trim()

删除了前导和尾随空格的此字符串的副本,或者此字符串(如果它没有前导或尾随空格)。

从实现中也很清楚:

public String trim() {
    //...
    return ((st > 0) || (len < count)) ? substring(st, len) : this;
}

如果发现一些前导或尾随空格,substring()则称为返回 new Stringthis否则返回。

有趣的事实:在这两种情况下(如果this返回和何时substring()调用)返回的对象都指向相同的原始char[]数组。只有包装String对象发生变化,并且数组索引选择该数组的子集。

于 2012-09-30T10:04:28.230 回答
3
if("hello".trim() == "hello".trim())

在这里,您的字符串实际上并未被修改..而在第二种情况下:-

if("hello ".trim() == "hello ".trim())

您正在修改字符串..两个字符串都创建不同的对象..

虽然,如果您尝试使用equals()方法比较它们,您将获得所需的结果.. Asequals()方法比较两个字符串的内容,而==比较参考..

因此,当使用 比较具有相同内容的两个不同字符串对象时==,您实际上是在比较reference那些不同的字符串。

于 2012-09-30T10:01:28.180 回答
1

从文档 -修剪:

“如果此 String 对象表示一个空字符序列,或者此 String 对象表示的字符序列的第一个和最后一个字符的代码都大于 '\u0020'(空格字符),则返回对该 String 对象的引用。 "

(在您的第一个示例中,您会得到相同的参考)

"否则,设k为字符串中编码大于'\u0020'的第一个字符的索引,设m为字符串中编码大于'\u0020'的最后一个字符的索引。一个新的String 对象被创建,表示这个字符串的子字符串,它以索引 k 处的字符开始,以索引 m 处的字符结束——即 this.substring(k, m+1) 的结果。"

(因此,创建了两个新字符串,由于内存中的两个对象不同,因此决定返回 false)

为了将来参考,您可以这样做:if ("hello ".trim().equals("hello ".trim()))检查两个字符串的内容是否相等。

于 2012-09-30T10:06:51.827 回答