欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

equals(),==,hashcode()

程序员文章站 2024-03-22 17:46:28
...

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