equals和==

equals和==

准则:

基本类型判断是否相等用==方法,引用类型判断是否相等用equals方法

object类的equals方法底层代码是通过==实现的,所以我们在编写类的时候需要重写equals。

``

public static boolean equals(Object a, Object b) {
    return (a == b) || (a != null && a.equals(b));
}

分析:这已经是改进过的了,原始版本为return a == b;

改进之后:首先判断a==b,如果不可以,再判断equals,只有当两者都不通过时,再判断a和b。

重写的equals如下:

public class Student1 {
    int id;
    String grade;

    public Student1() {
    }

    public Student1(int id, String grade) {
        this.id = id;
        this.grade = grade;
    }

    public int getId() {
        return id;
    }

    public String getGrade() {
        return grade;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setGrade(String grade) {
        this.grade = grade;
    }

    @Override
    public String toString() {
        return "Student1{" +
                "id=" + id +
                ", grade='" + grade + '\'' +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student1 student1 = (Student1) o;
        return id == student1.id && Objects.equals(grade, student1.grade);
        //这里进行引用类型用equals来进行判断
    }


}

结果分析:

因为类中的equals方法会调用属性类的equals方法,所以我们在创建类的时候尽量要重写equals方法。

总结:

  • 基本类型判断是否相等用==方法,引用类型判断是否相等用equals方法
  • object类的equals方法底层代码是通过==实现的,所以我们在编写类的时候需要重写equals。
  • 因为类中的equals方法会调用属性类的equals方法,所以我们在创建类的时候尽量要重写equals方法。
  • 位于基本类型(包装类)常量池中的,能够直接用==进行比较。
  • 还要注意字符串常量池

但是!!!类重写equals必须要重写hashCode()方法!!

长话短说,就是为了避免在需要hash值的hashmap、hashset、hashtable、currenthashmap等中,能够对相同内容的对象去重。

hash值不会影响==的判断, ==判断的是引用类型的内存地址不是hash值。这是我之前疑惑的一个点。

posted @ 2022-07-27 21:50  疯狂的豆包  阅读(27)  评论(0)    收藏  举报