==与 equals 的区别?

发布时间 2023-07-10 23:07:40作者: 一只礼貌狗

一. 介绍:

   Java中的 "=="  是一个运算符,是用于比较两个对象或基本数据类型之间的值是否相等。它的来源可以追溯到C语言,以及受C语言影响的许多其他编程语言。

   Java中的equals() 是一个方法,可重写该方法用于比较两个对象是否相等的方法。该方法继承自Object类,在Java的所有类中都可以使用。

 

二.  区别:

   1. 语法不同:

     == 是运算符 C语言编写的运算符;

     equals() 是Object类的方法;

 

   2. 作用不同:

    基本类型: == 是用来做值比较的,而equals()不能直接用于基本数据类型的比较,需要转换为其对应的包装类型。

    引用类型: == 和 equals() 都是比较栈内存中的地址是否相等 。相等为 true 否则为 false。Object中默认是比较地址值,但是通常对某个类重写equals()方法,以自定义两个对象相等的条件。

 

三. 代码展示

public class User   {

    private String name;

// 略: 构造方法、getter、setter、toString()等
// 重写equals() 方法
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;  // 若地址值一致则直接返回 true
        if (o == null || getClass() != o.getClass()) return false;  // 若对象为null 或者 对象非同一个类,则直接返回false;
        User user = (User) o;  // 获取该对象,强转为user类
        return Objects.equals(name, user.name); // 使用equals 比较对象属性是否一致,返回结果true 或 false
    }
// 重写hashcode方法
    @Override
    public int hashCode() {
        return Objects.hash(name);
    }
}

    public static void main(String[] args) {
        User u1 = new User("小米");
        User u2 = new User("小米");
        // 比较地址值
        System.out.println(u1 == u2);
        // 比较对象内容
        System.out.println(u1.equals(u2));
    }

输出结果:
    false
    true

    

  从代码上可以看出来在new 新对象后,地址值是发生改变的,通过 == 运算符 或者 原生Object.equals() 方法,是不能判断对象的属性的,所以需要在该类重写equals()方法,使自定义类比较其值是否相等。