为什么String s1 == s2如果我添加+"则返回false;"并返回True如果我使用了s1 == s2

时间:2015-05-15 05:17:48

标签: string

public class MainDemo 
{

    public void comp() 
    {
        String s1 = "abc";
        String s2 = "abc";
        System.out.print(""+s1==s2); // Why return false??? Plz clear my doubt? 
        System.out.println(s1==s2);//And why true for this
    }

    /**
      * @param args
     */
    public static void main(String[] args) 
    {
        // TODO Auto-generated method stub
        MainDemo obj=new MainDemo();
        obj.comp();
    }
}


#####################################################

为什么这会返回false ??

System.out.print(""+s1==s2); // Why return false??? 

请清除我的怀疑?

被修改

有人可以告诉我如何检查实例值

已编辑2

的System.out.println(s1.hashCode()); //两个都是一样的

System.out.println(s2.hashCode()); //同样是

然后发生了什么?????

7 个答案:

答案 0 :(得分:1)

""+s1是一个新的String,因此与s2不是同一个对象。您应该equals比较Java中的字符串值。有关更多信息和示例,请查看:How do I compare strings in Java?

答案 1 :(得分:1)

  

如果我在这样的括号中关闭s1 == s2(s1 == s2)它返回true .....混淆

嗯,这些括号用于指定运算符优先级。与数学相同。

System.out.println("" + (s1 == s2));

那就是

System.out.println("" + true);

之前你所拥有的相当于

System.out.println( ( "" + s1) == s2);

答案 2 :(得分:1)

比较像这样的字符串不是一个好主意,请使用a1.equals(a2);然后回答你的问题。

String a1="abc";
String a2="abc";
System.out.println(a1==a2); // true
System.out.println(""+a1==a2); // false
System.out.println(""+(a1==a2)); // true

看看这个""+a1。如果你试试""+a1==a1它会返回false,很困惑?不要因为""+a1只是一个新的String。虽然""+(a1==a2)首先进行比较,然后按照以下方式进行追加:""+(true)

我建议使用a1.equals(a2);代替==使用字符串

官方:here

  

equals(Object anObject)将此字符串与指定对象进行比较。

答案 3 :(得分:0)

==运算符检查对String对象的引用是否相等。

String.equals("");检查包含两个字符串。

答案 4 :(得分:0)

请在您的代码中查找我的评论..还可以阅读Cay Horstman的Core Java中的unicode等

公共类MainDemo {

    public void comp() {
        String s1 = "abc";//String  s1 "abc"
        String s2 = "abc";//String  s2 "abc"
        System.out.print(""+s1==s2); // Why return false??? Plz clear my    doubt? // its "null+abc"=="abc" // mind the null in first "abc" and tell they equal???
        System.out.println(s1==s2);//And why true for this // because here its "abc"=="abc" no null added to the string
   }

   /**
   * @param args
   */
   public static void main(String[] args) {
    // TODO Auto-generated method stub
    MainDemo obj=new MainDemo();
    obj.comp();

   }

}

答案 5 :(得分:0)

String s1 = "abc";
String s2 = "abc";
System.out.print(""+s1==s2);   // comparing a reference to object on heap with the reference to interned string in string pool
System.out.println(s1==s2);    // comparing references to same interned string in the string pool

正在为字符串s1和s2分配字符串文字,即在编译时知道值。 JVM将在字符串池中实习它们,而s1和s2实际上都指向字符串池中的同一字符串。

当您执行(s1==s2);时,s1和s2都引用字符串池中的同一字符串,因此它们返回true。 但是执行(""+s1==s2);会返回false,因为""+s1将在运行时进行评估。 JVM将在堆上创建一个字符串对象,该对象将依次指向字符串池中的"abc"

使用

强制进行字符串实习
System.out.println((""+s1).intern() == s2);    // true because of explicit interning

通常,最好使用.equals()比较字符串。如果要直接比较字符串,则必须知道JVM如何在后台处理字符串。

阅读What is Java String interning?进行进一步的澄清。

答案 6 :(得分:-1)

因为String s1的长度现在已经改变了。使用字符串长度函数检查这些字符串的长度,并查看它返回的内容。