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