JavaDog程序狗
JavaDog程序狗
发布于 2025-05-30 / 11 阅读
0
0

【Java】面试必问!equals和==傻傻分不清?

前言

🌚夜聊缘由

Java面试必问!equals和==傻傻分不清?一文让你笑出腹肌!

Java

想象你去相亲,对方问你:“你和我是不是同一个人?”
你一脸懵逼:“这问题太抽象了吧!”
对方掏出身份证:“身份证号一样吗?”(这叫==)
又问:“性格脾气都一样吗?”(这叫equals)

Java中的==equals就像相亲中的“身份证号”和“灵魂契合度”,今天咱们用“相亲理论”+“代码实战”,让你彻底告别面试翻车现场!


🌟闪亮主角

一文搞懂Java中equals和==的区别:从相亲现场到代码战场

大家好,我是JavaDog程序狗

今天带你拆解Java中这对“相爱相杀”的双胞胎操作符!从“身份证号玄学”到“灵魂伴侣鉴定”,咱们一个不落!


正文

🎯主要目标

1. 为什么==equals总让人头秃?

2. ==:身份证号比对大师 vs equals:灵魂伴侣鉴定师

3. 基本类型和引用类型:相亲对象的“人设崩塌”现场

4. String的骚操作:为什么有时候==也能当equals用?

5. 代码实战:用相亲案例演示操作符的“相爱相杀”


🍪目标讲解

一. 为什么==equals总让人头秃?

1. 白话理解

Java中的==equals就像相亲中的两种提问方式:

  • ==:问的是“身份证号一样吗?”(比对内存地址)
  • equals:问的是“你是不是我灵魂伴侣?”(比对实际内容)

2. 技术定义

  • ==:比较基本类型值是否相等,或引用类型指向的内存地址是否相同。
  • equals:由Object类定义,默认行为与==相同,但可以被重写(比如String类)来比较实际内容。

二. == vs equals:身份证号 vs 灵魂契合度

1. 基本类型:直接比颜值(值)

int a = 10;
int b = 10;
System.out.println(a == b); // true(颜值一样)

2. 引用类型:比身份证号 vs 比灵魂

String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1 == str2); // false(身份证号不同!)
System.out.println(str1.equals(str2)); // true(灵魂契合!)

3. 特殊案例:String的骚操作

String str3 = "hello";
String str4 = "hello";
System.out.println(str3 == str4); // true(字符串常量池的玄学!)

三. 常见翻车现场:面试官的“灵魂拷问”

1. 案例1:自定义对象的“相亲失败”

class Person {
    String name;
    int age;
    
    // 必须重写equals!否则相亲失败!
}

Person p1 = new Person("张三", 25);
Person p2 = new Person("张三", 25);
System.out.println(p1.equals(p2)); // false(默认比身份证号!)

2. 案例2:数组的“颜值陷阱”

int[] arr1 = {1, 2, 3};
int[] arr2 = {1, 2, 3};
System.out.println(arr1.equals(arr2)); // 报错!数组没有重写equals!
System.out.println(Arrays.equals(arr1, arr2)); // 正确姿势!

四. 代码实战:用相亲案例演示操作符的“相爱相杀”

1. 场景:程序员的相亲现场

class Programmer {
    String name;
    int salary;
    
    // 必须重写equals!否则相亲翻车!
    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        Programmer that = (Programmer) obj;
        return salary == that.salary && 
               Objects.equals(name, that.name);
    }
}

Programmer me = new Programmer("JavaDog", 30000);
Programmer candidate1 = me; // 同一个身份证号!
Programmer candidate2 = new Programmer("JavaDog", 30000);

System.out.println(me == candidate1); // true(身份证号相同!)
System.out.println(me == candidate2); // false(新身份证!)
System.out.println(me.equals(candidate2)); // true(灵魂契合!)

2. 实验结果

// 输出:
// true
// false
// true

总结

Java中的==equals就像相亲中的“身份证号”和“灵魂契合度”:

  • ==:比对内存地址(身份证号),适合基本类型或判断对象是否为同一个实例。
  • equals:比对实际内容(灵魂契合度),需要手动重写(尤其是自定义类)!

记住:

  • String类是个例外(字符串常量池的玄学)。
  • 数组和集合类要小心(默认不比较内容!)。

最后送你一句程序员相亲金句:
“我们虽然身份证号不同,但equals()说我们是灵魂伴侣!”


🍈猜你想问

如何与博主联系进行探讨

1.关注公众号【JavaDog程序狗】

公众号回复【入群】或者【加入】,便可成为【程序员学习交流摸鱼群】的一员,问题随便问,牛逼随便吹,目前群内已有超过380+个小伙伴啦!!!

2. 踩踩博主博客

javadog.net

里面有博主的私密联系方式呦 !,大家可以在里面留言,随意发挥,有问必答😘

🍯猜你喜欢

文章推荐

【实操】Spring Cloud Alibaba AI,阿里AI这不得玩一下(含前后端源码)

【规范】看看人家Git提交描述,那叫一个规矩

【项目实战】SpringBoot+uniapp+uview2打造H5+小程序+APP入门学习的聊天小项目

【项目实战】SpringBoot+uniapp+uview2打造一个企业黑红名单吐槽小程序

【模块分层】还不会SpringBoot项目模块分层?来这手把手教你!


评论