当我比较时("字符串" =="字符串"),我正在比较的是两个对象还是两个引用?
请解释以下代码段的输出:
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陈述的输出也应该是真的。请解释这里发生了什么。
答案 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
的第二次调用返回一个不同的对象,不在常量池