1

我有附加字符串的情况。我很困惑..

   public static void foo() {
       String s = "str4";
       String s1 = "str" + s.length();
       System.out.println("(s==s1) = " + (s1 == s));
   }

    public static void bar() {
       String s = "str4";
       String s1 = "str" + "4";
       System.out.println("(s==s1) = " + (s1 == s));
    }

在第一种情况下,它返回“false”,但在第二种情况下返回“true”据我所知,在这两种情况下,“str4”对象都是在堆上创建的。所以它在这两种情况下都应该返回 true。但事实并非如此。请有人帮我弄清楚为什么会这样。? 谢谢。!

4

4 回答 4

3

利用

s1.equals(s)

比较字符串,否则比较引用。

在第二种情况下,它返回,true因为String s1 = "str" + "4";将被优化为String s1 = "str4";并且将引用相同的字符串。ss1

于 2013-03-21T06:48:57.613 回答
0

以我自己的理解:

"str" => 字符串

“4” => 字符串

然而,

s.length() => int

使用 ==,比较内存位置。

使用第一个示例,Java 创建另一个字符串,该字符串位于“s”位置以外的另一个内存位置,因为您正在尝试执行 String + int = String。

第二个示例返回 true ,因为它与您的 's' 只是相同的内存位置,只是值已更改。字符串 + 字符串 = 连接字符串

由于您正在尝试比较两个字符串内部是否具有相同的字符但不一定位于相同的位置,因此s.equals(s1)是最佳解决方案。

但是,如果您想测试两个变量是否都指向同一个对象,则必须使用==因为它的浅比较

于 2013-03-21T07:11:49.833 回答
0

你需要为此使用 .equals()

.equals() // if you dont want to ignore case

.equalsIgnoreCase() // if you want to ignore case

== 比较参考。

在第二种情况下,两个字符串都相等。所以引用也相等。

   String s = "str4";
   String s1 = "str" + "4"; .//finally str4

这里 s1 和 s2 的内容是相等的。所以它们具有相同的引用。

于 2013-03-21T06:49:16.907 回答
0

Java 中的 == 运算符仅在两个引用都指向同一个对象时才返回 true。如果您尝试比较两个字符串的等效内容,则必须使用 equals() 方法。

于 2013-03-21T06:50:43.800 回答