String string = "abcd";
String string2 = "abcd";
String string3 = new String("abcd");
System.out.println(string == string2);
System.out.println(string == string3);
System.out.println(string.equals(string3));
答案:true、false、true
对于基本类型,“==”比较数值大小,对于引用类型,比较引用的地址。string
在常量池中,而 string3
在堆中,地址肯定不一样,string2
也在常量池中,当常量池中存在此常量时,就返回此常量,如果不存在,再新建一个
,因此string2
和string
指向同一个地址。
equals()方法,是在Object类中定义的
public boolean equals(Object obj) {
return (this == obj);
}
在object中也是直接使用“==”,但是String类重写了equals()方法
public boolean equals(Object anObject) {
if (this == anObject) {//同一个对象时
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
从上述代码中看出,String中equals()方法直接比较对象中存储值得大小。故System.out.println(string.equals(string3))
的结果为true。
java中包装类Boolean、Byte、Double、Float、Long、Integer等都重写equals方法,都是比较值。