细谈 == 和 equals 的具体区别 【包括equals源码分析】

1.前言

  昨天舍友去面试,被面试官的问题难住了:俩个学生类除了学生姓名不同用.equal来比较。

我是一脸懵逼的 ,问题说的很模糊 ,

理解字面意思为 :一个 实体类名叫Student ,内部属性有学生姓名等 ,然后该类被new 了两个对象 ,输入不同的name值 ,然后使用 .equals比较是否相同。

  我是怎么想都觉得不可能相等的啊 ,new了不同的对象 ,不论是存在栈还是堆空间的地址都不可能相同的 ,难道使用get方法一个一个值取出来再比较?

这问题简直是脱裤子放屁。

2.操作

实体类Student

package com.example.javabaisc.MyEqual;

public class Student {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
View Code

测试类

package com.example.javabaisc.MyEqual;

import org.junit.jupiter.api.Test;

public class StuTest {

    @Test
    public void t() {
        Student student = new Student();
        student.setAge(18);
        student.setName("cen");

        Student student2 = new Student();
        student2.setAge(18);
        student2.setName("cen");

        System.out.println("========equql 比较对象=============");
        if (student.equals(student2)) {
            System.out.println("一样");
        } else {
            System.out.println("不一样");
        }
        System.out.println("==========使用 == 比较地址空间====================");
        if (student == student2) {
            System.out.println("一样");
        } else {
            System.out.println("不一样");
        }

    }

}
View Code

 

3.测试

启动测试类,打印结构

 

 4.分析

看到打印结果,果然不出我所料,不论是  == 比较还是 equals 比较,结果都是false ,即不等。

为什么?

  ==号,如果比较的两个 元素是 基本数据类型 ,则直接比较数值   ,如果是引用类型 【也就是对象】,则比较的是一个对象在内存中的地址值【常量放在常量池、对象放在堆里面,都有相应的空间地址】

  equals 的情况比较复杂,首先会比较 对象在内存中的地址值 ,如果不相等 ,则继续比较,先判断是不是String类型 ,如果不是则直接返回false ,如果是,则将对象强转String ,

然后将一位一位的字符比较ASCLL码是否相等,如果有一个不等,则直接返回false,如果全部相等,则返回true.

下图为源码:

 

 5.结论

 使用equals对比两个对象【指new了两个新的对象,即便类型】,那么地址值必然不同,同时如果对象不是String类型 ,则永远是false。

如果地址值是相同的【任意类型,不仅仅是String类型】,那么使用equals对比,则会是true ,但是不能保证内部的值是相同的。

比如在 哈希表的比较中 ,使用equals对比 哈希值 ,如果哈希值相同,则地址必然相同,但是该地址存储的对象则不一定相同【即便对象相同,但是值也不一定相同】。

 

posted @ 2020-06-13 13:39  岑惜  阅读(232)  评论(0编辑  收藏  举报