【问题标题】:How does the comparison in Strings work? [duplicate]字符串中的比较如何工作? [复制]
【发布时间】:2023-03-03 10:58:01
【问题描述】:

当我比较 ("String"=="String") 时,我到底比较的是两个对象还是两个引用?

请解释以下代码sn-ps的输出:

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 条语句的输出也应该为真。请解释这里发生了什么。

【问题讨论】:

  • 因为"String " 和"String" 是两个不同的对象......并且您正在比较参考。你不能断定这行 "根据语句 1 和 2..."

标签: java string trim string-comparison


【解决方案1】:

来自我之前的answer,你要记住,== 比较的是对象引用,而不是内容。

【讨论】:

    【解决方案2】:

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

    • 在第一种情况下,答案是正确的,这并不奇怪,因为引用是相等的

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

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

    【讨论】:

    • System.out.println("String ".trim()) 显示与 System.out.println("String") 相同的哈希码。那么第三个语句如何评估为假。
    【解决方案3】:

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

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

    请改用.equals()。

    【讨论】:

      【解决方案4】:

      == 比较您要比较的两个 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。

      【讨论】:

        【解决方案5】:

        你必须使用方法

         equals() 
        

        比较字符串。取而代之的是 == 你正在比较

        references. 
        

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 2012-11-04
            • 2016-11-24
            • 1970-01-01
            • 1970-01-01
            • 2019-09-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-12-24
            相关资源
            最近更新 更多