天天看點

equals(),==,hashcode()equals和==hashcode()和equals()

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