java中的字符串引用

时间:2012-09-30 09:56:11

标签: java

  

可能重复:
  String comparison and String interning in Java

我尝试在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");

任何人都可以解释为什么我会“不等于”......?

4 个答案:

答案 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()))检查两个字符串的内容是否相等。