equals和==
1“==”判斷兩個引用對象是否指向同一記憶體位址
2“equals()”判斷兩者的内容是否相等屬于java.lang.Object的方法。每個子類可以覆寫該方法來實作自己的内容相等。
3“equals()”Object類中預設是靠" ==”識别,但是其他類像Integer,String會覆寫掉實作自己的equals方法;
String a = new String("abc");
String b = new String("abc");
System.out.println(a==b);//false
System.out.println(a.equals(b));//true
String c = "aaa";//放入常量池
String d = "aaa";//判斷常量詞已經有了就去常量池的引用
System.out.println(c==d);//true
System.out.println(c.equals(d));//true
String 類型的equals覆寫
public boolean equals(Object object){
Object a = object;
if(a.instaceof("String")){
String b = (String)a;
int len1=b.length();
int len2=this.length();
if(len1!=len2) return false;
int k=0;
while(k<len){
if(b.value[k]!=this.value[k]){
return false;
}
k++;
}
return true;
}
return false;
}
hashcode()和equals()
由來,在set無序集合中,存儲着很多很多個對象,我們每插入一個理應将新插入的對象 a,與其他對象做比較,a.equals(other);但是這樣太過浪費時間。
首先我們利用hashcode()去計算,每個對象很容易計算自己的hashcode();
首先hashcode()相等了,他們有可能相等。
如果hashcode()不等那麼他們就一定就不等。
這句話很重要,可以思考下
我們利用這個特性很快就能推斷出他們是否不等。
equals()和hashcode()的聯系
1equals相等,hashcode()理應相等。
2hashcode()相等,equals不一定相等。
3重寫equals方法時,一定要重寫hashcode()來保持一緻。
我們看下面這個例子如果不覆寫hashcode()的後果
public class HashDemo {
public static void main(String[] args) {
Person person = new Person("a");
Person person1 = new Person("a");
System.out.println(person.equals(person1));
HashSet<Person> people = new HashSet<>();
people.add(person);
people.add(person1);
System.out.println(people.size());
}
}
//自定義Person類,我們認為如果person對象的字段a相等,那麼他們理應為同一對象,添加到set是理應被判斷為同一對象。
class Person {
String a;
public Person(String a) {
this.a = a;
}
@Override
public boolean equals(Object obj) {
if (obj==null) return false;
if (this == obj) {
return true;
}
if (obj.getClass() == this.getClass()) {
Person person =(Person) obj;
if (this.a==person.a) {
return true;
}
}
return false;
}
}
最後結果
true
2
原因set認為他們不是同一對象,因為沒有覆寫hashcode()方法。set判斷對象是否是同一對象先用hashcode方法判斷他們是否相等,不等直接就抛出false(相等時才繼續執行equals方法)是以我們需要覆寫hashcode();
class Person {
String a;
public Person(String a) {
this.a = a;
}
@Override
public boolean equals(Object obj) {
if (obj==null) return false;
if (this == obj) {
return true;
}
if (obj.getClass() == this.getClass()) {
Person person =(Person) obj;
if (this.a==person.a) {
return true;
}
}
return false;
}
@Override
public int hashCode() {
//使用字元串的hashcode方法來覆寫。
return a.hashCode();
}
}
覆寫hashcode()結果為
true
1