1.==分析
对于基本数据类型和引用数据类型==作用的效果是不同的。
· 基本数据类型:比较的是值。
· 引用数据类型:比较的是引用。
String a = "CSDN";
String b = "CSDN";
String c = new String("CSDN");
System.out.println( a == b ); // true
System.out.println( a == c ); //false
System.out.println(a.equals(c));//true
代码解读:
a和b指向的是同一个引用,而new String(" ");则会开辟一个新的内存空间,所以c和a所指向的内存地址不同。
2.equals分析
equals本质上就是==,只不过是String、Integer等重写了equals方法,将其改为值比较。
如下代码比较一个相同值的两个对象
public class Person{
private String name;
public Person(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
}
Person p1 = new Person("小明");
Person p2 = new Person("小明");
System.out.println(p1.equals(p2));//false
结果是false,原因如下equals源码
public boolean equals(Object obj){
return (this == obj);
}
这可以说明equals本质就是==,为什么String对象值相等的equals是true,如下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方法,将引用比较改为了值比较。
总结:==对于基本数据类型是值比较,对引用数据类型是引用比较。equals在默认情况下和 == 相同,但Java中有些类对equals进行了重写如String、Integer,所以比较的是值。