字符串中的比较如何工作?

时间:2014-06-25 07:24:58

标签: java string trim string-comparison

当我比较时("字符串" =="字符串"),我正在比较的是两个对象还是两个引用?

请解释以下代码段的输出:

1) System.out.println("String".toString()=="String"); // output is true

2) System.out.println("String".trim()=="String"); // output is true

3) System.out.println("String ".trim()=="String"); // output is false

根据陈述1和2,第3陈述的输出也应该是真的。请解释这里发生了什么。

6 个答案:

答案 0 :(得分:2)

从我之前的answer开始,您必须记住,==比较对象引用,而不是内容。

答案 1 :(得分:1)

trim() 会删除此字符串的副本,其中删除了前导和尾随空格,如果没有前导或尾随空格,则返回此字符串。

  • 在第一种情况下,答案是真的,因为引用相等而没有意外

  • 在第二种情况下没有前导或尾随空格,因此trim再次返回相同的字符串引用相等

  • 在最后一种情况下trim返回一个副本,因为该字符串有一个尾随空格,导致不同的引用,因此您的比较将为false。

答案 2 :(得分:0)

在java中,你永远不应该将字符串与等号运算符==进行比较,因为该运算符会比较引用而不是内容。编译器足够智能,可以为代码中找到的所有相等文字重用一个引用(因此,1)中的String和2)中的四次出现可能是同一个实例)。但是在3)中你有两个不同的文字,并且不能保证"String ".trim()将由与文字相同的实例表示。

另请参阅:https://stackoverflow.com/a/513839/55787

改为使用.equals()

答案 3 :(得分:0)

==比较您要比较的两个String引用是否指向同一个String实例。

要回答您的问题,您需要检查String类

中方法的源代码
public String trim() {
int len = count;
int st = 0;
int off = offset;      /* avoid getfield opcode */
char[] val = value;    /* avoid getfield opcode */

while ((st < len) && (val[off + st] <= ' ')) {
    st++;
}
while ((st < len) && (val[off + len - 1] <= ' ')) {
    len--;
}
return ((st > 0) || (len < count)) ? substring(st, len) : this;
}

public String toString() {
return this;
}

正如你所看到的那样,this如果没有任何东西需要修剪,那么trim会返回toString。此外,this只会返回{{1}}。

答案 4 :(得分:0)

你必须使用方法

 equals() 

比较字符串。而不是==你正在比较

references. 

答案 5 :(得分:0)

==比较内存位置。在第一种情况下,toString方法返回相同的对象,并且由于要比较的两个"String"对象都指向常量池上的同一对象,因此结果为true。在第二种情况下,trim方法不对String进行修改,因此它返回相同的对象,结果相同。第三种情况和对trim的第二次调用返回一个不同的对象,不在常量池