Java面试之Java基础9——==与equals

==与equals的区别

  == equals
情况一 如果等号左右两侧是基本数据类型,则比较的是值是否相等。 如果类没有重写equals()方法,那么等价于"=="的情况,即比较两个对象的地址值是否相等。
情况二 如果等号左右两侧是引用数据类型(类对象),则比较的是两个对象的内存地址值是否相等。 如果类重写了equals()方法,那么比较的是两个类对象的内容是否相等。

==

概述:比较两个对象是否相等。

class Person {
    private String name;

    public Person() {
    }

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

public class Demo {
    public static void main(String[] args) {
        /*
            ==的两种情况:
                1.如果是基本数据类型,则比较值是否相等
                2.如果是引用数据类型,则比较对象地址值是否相等
         */
        // 1.比较值是否相等
        System.out.println(2 == 2);
        // 2.比较地址值是否相等
        Person p1 = new Person("张三");
        Person p2 = new Person("张三");
        System.out.println(p1 == p2);
        System.out.println("p1的地址值:"+System.identityHashCode(p1));
        System.out.println("p2的地址值:"+System.identityHashCode(p2));
    }
}
/**
 * 打印结果:
 * true
 * false
 */

查看控制台打印情况:

equals

概述:也是比较两个对象是否相等,不过要分是否重写equals()两种情况。

// 没有重写equals()方法的类
class PersonWithoutEquals {
    private String name;

    public PersonWithoutEquals() {
    }

    public PersonWithoutEquals(String name) {
        this.name = name;
    }
}

// 重写了equals()方法的类
class PersonWithEquals {
    private String name;

    public PersonWithEquals() {
    }

    public PersonWithEquals(String name) {
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        PersonWithEquals that = (PersonWithEquals) o;

        return name != null ? name.equals(that.name) : that.name == null;
    }

    @Override
    public int hashCode() {
        return name != null ? name.hashCode() : 0;
    }
}

public class Demo {
    public static void main(String[] args) {
        /*
            equals()的两种情况:
                1.如果类没有重写equals()方法,那么比较的是内存地址值,等价于"=="
                2.如果类重写了equals()方法,那么比较的类对象的内容
         */
        // 1.没有重写equals()方法
        PersonWithoutEquals p1 = new PersonWithoutEquals("张三");
        PersonWithoutEquals p2 = new PersonWithoutEquals("张三");
        System.out.println(p1.equals(p2));
        System.out.println(p1 == p2);
        System.out.println("p1的地址值:" + System.identityHashCode(p1));
        System.out.println("p2的地址值:" + System.identityHashCode(p2));
        // 2.重写了equals()方法
        PersonWithEquals p3 = new PersonWithEquals("张三");
        PersonWithEquals p4 = new PersonWithEquals("张三");
        System.out.println(p3.equals(p4));
        System.out.println(p3 == p4);
        System.out.println("p3的地址值:" + System.identityHashCode(p3));
        System.out.println("p4的地址值:" + System.identityHashCode(p4));
    }
}
/**
 * 打印结果:
 * false
 * false
 * true
 * false
 */

equals重写方法是通过IDEA快捷生成的,其代码如下:

为这份代码注释下:

手动重写equals()方法代码如下:

其中Object类中的equals方法源码如下:

也就是如果不重写equals方法,那么默认比较就是用的是“==”,即比较内存地址。

猜你喜欢

转载自blog.csdn.net/cnds123321/article/details/113485920