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???
请清除我的怀疑?
有人可以告诉我如何检查实例值
的System.out.println(s1.hashCode()); //两个都是一样的
System.out.println(s2.hashCode()); //同样是
然后发生了什么?????
答案 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的长度现在已经改变了。使用字符串长度函数检查这些字符串的长度,并查看它返回的内容。