在java的学习中会遇到比较两个内容相同的字符串结果不相等的问题。
这是因为在java中在比较基本数据类型的时候比较的是他们的值,而在比较是对象的时候比较的是其id。
下面用一段代码来解释一下。
package equals;
public class Equ {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
A a1 = new A("abc");
B b1 = new B("abc");
C c1 = new C("abc");
System.out.println();//在此处设置断点
}
}
class A {
String str;
public A(String str) {
this.str = str;
}
}
class B {
String str;
public B(String str) {
this.str = str;
}
}
class C {
String str;
public C(String str) {
this.str = new String(str);
}
}
在输出语句处 设置一个断点,然后debug
在debug界面的右上角有一窗口,里面明确写着各个对象的id
现在可以看到s1
中字符串的id是17与s2
中的字符串id相同,也就是说s1
与s2
中的字符串是引用的同一个。这样不论是用==
比较还是用equals
比较,结果都是true
。
再来看s2
和s3
,s2
字符串的id是17,s3
字符串的id是23。这是因为s3
是用new
创建的对象而不是引用来的。s2 == s3
相当于17 == 23
结果显然是false
,这时要比较他们是值需要用equals
进行比较,s2.equals(s3)
结果为true
a1对象与b1对象,在构造方法执行时,都是引用的"abc"
因此其字符串id都是17,
而c1对象的str则是new
创建的字符串,由此可以看到即使对象是用new
创建,但对象中的属性也是有可能引用的同一个。