Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 如果我添加+,为什么字符串s1==s2返回false&引用&引用;如果使用s1==s2,则返回True_String - Fatal编程技术网

String 如果我添加+,为什么字符串s1==s2返回false&引用&引用;如果使用s1==s2,则返回True

String 如果我添加+,为什么字符串s1==s2返回false&引用&引用;如果使用s1==s2,则返回True,string,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

为什么这个返回错误

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();
    }
}


#####################################################
请澄清我的疑问


编辑 有人能告诉我如何检查实例值吗


编辑2 System.out.println(s1.hashCode());//两者都是一样的

System.out.println(s2.hashCode());//两者都是一样的


那这个怎么了????

“+s1
是一个新字符串,因此与
s2
的对象不同。您应该使用
equals
来比较Java中字符串的值。有关更多信息和示例,请参阅:

操作符检查对字符串对象的引用是否相等


字符串中,等于(“”)检查两个字符串的长度。

因为字符串s1的长度现在已更改。使用stringlength函数检查这些字符串的长度,看看它返回什么


如果我像这样关闭括号中的s1==s2(s1==s2),它将返回true

好的,这些圆括号用来指定运算符的进位。和数学一样

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

System.out.println("" + (s1 == s2));
你以前拥有的相当于

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

比较这样的字符串不是一个好主意,使用
a1.equals(a2)返回到您问题的答案

System.out.println( ( "" + s1) == s2);
看看这个
“”+a1
。如果您尝试
“”+a1==a1
它会返回false,混淆吗?不要这样做,因为
“+a1
只是堆上的一个新字符串对象,它指向字符串池中的“abc”。而
“”+(a1==a2)
则将第一个和第二个进行比较,如下所示:
“”+(true)

正如我建议的那样,使用
a1.equals(a2)而不是带字符串的
=

官员:

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


请在您的代码中找到我的注释。。也可以从Cay Horstman的Core Java中读取unicode等

公共类MainDemo{

String a1="abc";
String a2="abc";
System.out.println(a1==a2); // true
System.out.println(""+a1==a2); // false
System.out.println(""+(a1==a2)); // true
字符串s1和字符串s2被分配了字符串文本,即编译时已知值。JVM将把它们插入字符串池,而s1和s2实际上都指向字符串池中的同一个字符串

执行
(s1==s2);
s1和s2都引用字符串池中的同一字符串,因此它们返回true。 但是执行
(“”+s1==s2);
返回false,因为
“”+s1
将在运行时进行计算。JVM将在堆上创建一个字符串对象,该对象反过来将指向字符串池中的
“abc”

使用

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
通常,最好使用.equals()来比较字符串。如果要直接比较字符串,必须知道JVM在幕后是如何处理字符串的


阅读进一步说明。

可能重复的
“”+s1
创建了一个新字符串。因此它不会与任何现有字符串是同一个实例。如果我像这样关闭括号中的s1==s2(s1==s2)其返回值为true….Confuseed…谢谢Avinash,但我想知道为什么会发生这种情况?@thilo我如何检查它是否是另一个实例?它返回相同的值,因为它是“not”。请记住:
@Uzair不相同,但这不是确定的原因…并且没有空间。@user2861577获得它,伙计”+添加null+S1==S2还请记住“字符串是null字符串。
”+S1
不是
null ABC
甚至
“+S1==”+S1
是false。这可能就是答案。是否应用了任何先例规则???因为它首先检查括号,然后检查“+?”?谢谢,在编译器解析表达式时应用了运算符的优先级(根据优先级和/或从右到左),首先将其放入缓冲区(system.out)或任何语句或任何其他内容。我想这就是我要找的。@Thilo您对@Sarz Answer有何评论??
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
System.out.println((""+s1).intern() == s2);    // true because of explicit interning