Java中“==”运算符和equals(Object obj)方法的区别

JAVA学习网 2020-08-23 20:40:01

== 运算符

== 既可以用于基本数据类型的比较,也可以用于引用数据类型的比较
(1)如果比较的是基本数据类型变量:比较两个变量的值是否相等,相等即为true

注意:当基本数据类型进行比较时,符号两边的数据必须类型兼容(类型相同或可自动类型转换),否则编译出错。
测试代码:

public class EqualsTest {
    public static void main(String[] args) {
        //基本数据类型
        int i = 10;
        int j = 10;
        float f = 10.0f;
        System.out.println(i == j);//true
        System.out.println(i == f);//true

        char c = 10;
        System.out.println(i == c);//true

        char c1 = 'A';
        char c2 = 65;
        System.out.println(c1 == c2);//true
        
        /*
        boolean b = true;
        System.out.println(b == i);//类型不兼容,不能进行自动类型转换,编译不通过,不能进行比较
        */
    }
}

(2))如果比较的是引用数据类型变量:比较两个对象的地址值是否相同,即两个引用是否指向同一个对象实体
注意:当引用数据类型进行比较时,符号两边的数据类型必须兼容(类型相同或有父子类关系),否则编译不通过。
代码示例:

class Person {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

public class EqualsTest {
    public static void main(String[] args) {
        //引用数据类型比较
        Person p1 = new Person("Tom", 18);
        Person p2 = new Person("Tom", 18);
        System.out.println(p1 == p2);//false

        String str1 = new String("Java");
        String str2 = new String("Java");
        System.out.println(str1 == str2);//false

        /*
        Person p = new Person();
        String str = "hello";
        System.out.println(p == str);//Person和String类型无父子类关系,类型不兼容,不能进行比较
        */
    }
}

equals(Object obj) 方法

equals(Object obj)方法只能用于引用数据类型比较,最初是在Object类中定义的:

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

Object类中定义的equals方法和 == 的作用是相同的:比较两个对象的地址值是否相同,即两个引用是否指向同一个对象实体。如果一个类型没有重写equals方法,那么调用equals等价于 ==。
像String、Date、File、包装类等都重写了Object类中的equals()方法。重写以后,比较的是两个对象的类型和"实体内容"是否相同,而不考虑引用的是否是同一个对象。

class Person {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

public class EqualsTest {
    public static void main(String[] args) {
        //引用数据类型比较
        Person p1 = new Person("Tom", 18);
        Person p2 = new Person("Tom", 18);
        System.out.println(p1.equals(p2));//false,Person类没有重写equals方法,比较的是对象的地址
        
        String str1 = new String("Java");
        String str2 = new String("Java");
        System.out.println(str1.equals(str2));//true,String类重写了equals方法,比较内容

        Date date1 = new Date(4512574565L);
        Date date2 = new Date(4512574565L);
        System.out.println(date1.equals(date2));//true,Date类重写了equals方法,比较内容
    }
}

自定义类中要根据有没有重写Object类的equals方法来判断;通常情况下,重写equals方法会比较类中的相应属性值是否都相同。

阅读(2357) 评论(0)