String s = "abc";
String s4 = s + "";
System.out.println(s4 == s);
System.out.println(s4.equals(s));
打印:
假
真
任何人都可以解释为什么会这样吗?
答案 0 :(得分:3)
String s="abc"; // goes to string constants pool
String s4 = s +"" ;// has value "abc" but goes on heap and not in string constants pool
System.out.println(s4==s);//well,, the references are not equal. There are 2 diffrent instances with value="abc"
System.out.println(s4.equals(s)); // equals() checks for value and the values of both insatnces are equal.
答案 1 :(得分:1)
以下是您在评论中输出的代码 -
String s="abc";
String s4 = s +"" ;
System.out.println(s4==s); //false
System.out.println(s4.equals(s)); //true
第一个是false
,因为它正在检查s4
和s
的引用。由于这两个引用不同,因此评估为false
。这里==
(相等)运算符在应用于引用类型时用于检查两个引用是相同还是不同。
equals()
是一种方法,它是通过对象类中的每个引用类型实现的。您可以覆盖自己类的equals()方法。
equals(s)
方法用于检查两个对象是否有意义等于。对于String
类,有意义的等于意味着两个比较字符串相同但它们的引用可能不同。 String
类已经覆盖equals()
方法,因此您无需自行覆盖equals()
方法。
现在要了解字符串池概念,请考虑以下代码段 -
String s5 = s;
System.out.println(s5); //abc
System.out.println(s5==s); //true
System.out.println(s5.equals(s)); //true
此处s5==s
评估为true。因为s5
没有引用新的String对象。它引用了s
池中现有的String对象(即string
引用的“abc”)。现在,引用s5
和s4
都是等于。在最后一个语句中,s5和s有意义地等于,因此s5.equals(s)
被评估为true
。
希望它会有所帮助 非常感谢。