“==”号和equals的区别/equals的重写

Java中平时总会遇到一些数据的比较,基本类型是否相等比较,引用类型是否相等比较。

又经常会遇到“==”和equals,有时候分不清两者的区别。现在在这整理一下。

  • 当遇到“==”比较的是基本类型数据时,就是比较两者“值”的大小;当比较的是引用类型时,比较的是变量所指向的对象的地址。
  • 当遇到equals比较时,只能是比较引用类型。同时要是没有重写equals方法,则比较的是对象的地址,要是重写的时候一般会直接比较对象所含属性的值。(equals方法是Object类的方法,任何类都是Object类的子类。当方法没有重写equals方法意味着直接继承了Object的原生equals方法,此时只比较了对象的地址。但是方法可以重写equals方法,使其比较的是对象属性的值的大小。) 

1:当定义一个类,构造两个对象的时候,在没有重写equals方法的时候,看返回的结果:

package equalsTest;

/**
 * @ClassName EqualsTest
 * @Description TODO
 * @Author Kikityer
 * @Date 2018/11/9 16:42
 * @Version 1.0.0
 **/
public class EqualsTest {
    public static void main(String[] args) {
        User user1 = new User("张伟",26);
        User user2 = new User("张伟",26);
        if (user1.equals(user2)){
            System.out.println("两个对象相等");
        }else {
            System.out.println("两个对象不相等");
        }
    }
}


/**
 * 定义了一个用户类,用作例子说明
 * 1:当没有重写equals方法时,直接比较两个对象是否相等。
 * 2:重写了equals方法之后,再来比较两个对象是否相等。
 */
class User{
    private String name;
    private Integer age;

    public User() {
    }

    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

}

 输出结果为:两个对象不相等

结果表明此时比较两个对象的时候是直接调用了Object类的equals方法实现对象的地址的比较的。

下面贴出Object类equals方法的源码

 public boolean equals(Object obj) {
        return (this == obj);
    }

上面equals方法底层调用的是“==”的比较方法,即比较两个对象的地址。


 2:当定义一个类,构造两个对象的时候,重写equals方法的时候,看返回的结果:

package equalsTest;

/**
 * @ClassName EqualsTest
 * @Description TODO
 * @Author Kikityer
 * @Date 2018/11/9 16:42
 * @Version 1.0.0
 **/
public class EqualsTest {
    public static void main(String[] args) {
        User user1 = new User("张伟",26);
        User user2 = new User("张伟",26);
        if (user1.equals(user2)){
            System.out.println("两个对象相等");
        }else {
            System.out.println("两个对象不相等");
        }
    }
}


/**
 * 定义了一个用户类,用作例子说明
 * 1:当没有重写equals方法时,直接比较两个对象是否相等。
 * 2:重写了equals方法之后,再来比较两个对象是否相等。
 */
class User{
    private String name;
    private Integer age;

    public User() {
    }

    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    //重写了Object类的equals方法
    @Override
    public boolean equals(Object obj) {
       if (obj == null){
           return false;
       }else if (obj instanceof User){
           User user = (User)obj;
           if (user.name == this.name && user.age == this.age){
               return true;
           }
       }
       return false;
    }
}

输出结果为:两个对象相等

结果表明此次比较调用的是重写之后的方法

猜你喜欢

转载自blog.csdn.net/weixin_40581455/article/details/83899749