==和equals的區別和聯繫
“==”是關係運算符,equals()是方法,同時他們的結果都返回布爾值;
“==”使用情況如下:
a)基本類型,比較的是值
b)引用類型,比較的是地址
c)不能比較沒有父子關係的兩個對象
equals()方法使用如下:
a)系統類一般已經覆蓋了equals(),比較的是內容。
b)用戶自定義類如果沒有覆蓋equals(),將調用父類的equals(比
如是Object),而Object的equals的比較是地址(return(this==obj);)
c)用戶自定義類需要覆蓋父類的equals()
注意:Object的==和equals比較的都是地址,作用相同
代碼示例:
public class Demo01 {
public static void main(String[] args) {
String s1 = new String("zhangsan");
String s2 = new String("zhangsan");
System.out.println(s1.equals(s2));//true
Book b1 = new Book("aa", "11");
Book b2 = new Book("aa", "11");
System.out.println(b1.equals(b2));//false
}
}
class Book{
private String name;
private String author;
public Book(String name, String author) {
super();
this.name = name;
this.author = author;
}
}
可以進入第一個equals方法看下源碼:string重寫了object的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;
}
而equals默認的方法是比較引用地址:
public boolean equals(Object obj) {
return (this == obj);
}
總結:在很多使用過程中,equals方法被重寫了,所有一般情況下比較的是兩者的值是否相等。