【问题标题】:String.trim() returning false for same referenced objectString.trim() 为相同的引用对象返回 false
【发布时间】:2013-04-15 08:01:21
【问题描述】:

为什么这是错误

String str1 = new String("Java    ");
String str2 = str1;
System.out.println(str1.trim()==str2.trim());  //false

最初 str2 引用 str1 对象。因此,对于 str1==str2,与 == 比较将返回 true

那为什么 .trim() 方法的这个 false 呢?

即使它为文字返回 false(没有 new 关键字)

String str1 = "Java    ";  //this is now without new keyword
String str2 = str1;
System.out.println(str1.trim()==str2.trim());

注意:我知道如何使用.equals 方法。但是想知道== 的行为,尤其是在 .trim() 的情况下,上面给出了两个示例。

【问题讨论】:

标签: java


【解决方案1】:

使用等于而不是 ==

System.out.println(str1.equals(str2.trim()));

【讨论】:

    【解决方案2】:

    使用equals()equalsIgnoreCase() 方法来比较字符串。 == 比较对象身份。

    【讨论】:

      【解决方案3】:

      字符串在 Java 中是不可变的。 字符串文字也被实习,即java维护一个字符串文字池。

      在前 2 行中,您创建了一个对象,并且 2 个引用 str1 和 str2 指向同一个对象。

      当 trim() 应用于字符串时,它会形成一个新的字符串对象并将当前引用分配给新对象。 但是由于在创建对象时使用了 new str1.trim() 和 str2.trim(),所以最终都创建了 2 个单独的对象。

      参考:http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#trim%28%29

      trim() 方法创建一个新对象。由于您在同一对象上单独应用了 trim()(尽管由多个引用 str1 和 str2 引用),因此创建了 2 个新对象。 这就是引用相等不起作用的原因。

      【讨论】:

      • 即使使用文字(没有 new 关键字)也会返回 false
      • @Amit 更新了我的答案。请立即检查。
      【解决方案4】:

      字符串与等号比较,而不是 ==

      【讨论】:

        【解决方案5】:

        "=="

        适用于引用函数trim 创建一个具有新引用的新对象。这就是它总是返回 false 的原因

        【讨论】:

          【解决方案6】:

          如果你想比较一个字符串的内容,你需要.equeals

          您的(修改后的)示例

          String str1 = new String("Java    ");
          String str2 = str1;
          System.out.println(str1.trim().equals(str2.trim()));  //is now true
          

          【讨论】:

            【解决方案7】:

            对于字符串比较,您应该使用str1.equals(str2)str1.equalsIgnoreCase(str2)

            更多积分请查看question

            【讨论】:

              【解决方案8】:

              由于您使用的是String str1=new String("Java "); 您不能使用== 运算符

              如果你使用String str1="Java ";,你可以使用==

              所以这里要么将代码更改为String str1="Java ";

              或改变

              System.out.println(str1.trim().equals(str2.trim())); 
              

              【讨论】:

              • 不准确。您总是可以使用== 运算符,但它会比较引用。如果您不使用new 关键字,则具有 same 字符串值的字符串的引用将是相同的(因为池)。这就是为什么== 在这种情况下是“好”
              • 是的。 == 可以一直使用。但是如果 String 是使用 new 运算符创建的,它将显示 not equal 因为两个字符串在内存中具有不同的哈希码。如果没有new,则两个字符串的哈希码相同,如果使用==,它将比较两个哈希码并认为相同
              【解决方案9】:

              你有两个不同的字符串,所以有两个不同的引用。要比较内容,请使用equals()

              【讨论】:

                【解决方案10】:

                == 将比较两个对象的 if 引用是否相同,因为它检查两个对象是否相同而不检查对象的内容。 由于字符串是一个对象 == 仅适用于字符串类型的相同对象,而不检查字符串的内容。 检查字符串的内容 使用

                  equals() or equalsIgnoreCase
                

                【讨论】:

                  【解决方案11】:

                  您正在使用== 符号进行比较。在java中this会比较实际对象,即两个变量是否指向内存中的同一个物理对象,同一个内存位置。

                  如果你想比较字符串的实际内容,那么如果你不关心大小写,你需要使用String类的equals方法(或equalsIgnoreCase)。

                  这同样适用于任何其他类型的对象。如果您使用== 比较它们,您将比较两个变量的物理内存位置。您可以使用equals 方法来比较对象的实际内容(前提是该类实际实现了该方法)。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2022-07-11
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-12-17
                    • 1970-01-01
                    相关资源
                    最近更新 更多