== 和 equals 的区别是什么?面试篇(第二天)(1)

文章详细解释了Java中equals方法在String类型和自定义对象中的行为差异,指出String的equals会先比较值,而其他对象默认只比较地址。如果要比较对象值,需在自定义类中重写equals方法。
摘要由CSDN通过智能技术生成
            }

            return true;

        }

    }

    return false;

}



通过源码可以看到equals方法中首先判断的是地址是否相同,如果地址相同则直接返回为true,如果地址不相同则再判断值是否相同。这里首先说明一下这段equals源码是在String类中的,如下图。  

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210328152205360.png)  

就是说只有String类型的使用equals方法才能先比较地址是否相同,如果地址不同则再比较值是否相同,那么equals在对象类型或者数组类型中有没有这种比较逻辑呢,我们看图。  

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210328152605955.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDA5NjEzMw==,size_16,color_FFFFFF,t_70)



    class Student {

        public Student(String name) {

            this.name = name;

        }



        private String name;



        public String getName() {

            return name;

        }



        public void setName(String name) {

            this.name = name;

        }

    }



    Student s1 = new Student("张三");

    Student s2 = new Student("张三");

    System.out.println(s1.equals(s2)); // false





    char [] q = {1,2,3};

    char [] w = {1,2,3};

    System.out.println(q.equals(w)); //false



我们实例了两个学生对象,然后对象name都赋值为“张三”,而我们也创建了两个数组对象,里面都是1、2、3,这样看来如果用equals方法的话,应该都为true才对,但是我们的结果都为false,这是为什么呢,让我们点击对象或者数组调用的equals方法中去看看,如图。  

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210328153055450.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDA5NjEzMw==,size_16,color_FFFFFF,t_70)  

我们可以看到对象和数组调用的equals方法都是Object类中的方法,而且Object类中的方法只有一个对比地址的逻辑,没有对比值的逻辑,所以如果我们没有重写equals方法的话,对象和数组都是用的Object类中的方法都是比较的地址,如果我们重写equalse的话才可以在equals方法中写比较值的逻辑,而String类型的equals方法本身就有比较值的逻辑,所以我们平时基本类型比较值的时候使用 == ,String类型比较值的时候使用equalse,如果要比较两个对象是否相等直接使用equalse的话比较的是两个对象的地址是否相等。



**总结**  

如果大家想了解更多的有关JAVA方面的面试题与答案详解请搜索关注我的微信公众号《小奇JAVA面试》里面每天都会更新JAVA面试题,希望能够帮助到大家。  

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210328153615855.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDA5NjEzMw==,size_16,color_FFFFFF,t_70)





#### 线程、数据库、算法、JVM、分布式、微服务、框架、Spring相关知识

![](https://img-blog.csdnimg.cn/img_convert/a8d18ab6a01f1dd7d1514ba5fd5539be.webp?x-oss-process=image/format,png)

#### 一线互联网P7面试集锦+各种大厂面试集锦

![](https://img-blog.csdnimg.cn/img_convert/ff246a987dddbac85bc4c64c0d85a774.webp?x-oss-process=image/format,png)

#### 学习笔记以及面试真题解析

![](https://img-blog.csdnimg.cn/img_convert/0892109d5da49dd547e2da188b8280a4.webp?x-oss-process=image/format,png)

集锦

[外链图片转存中...(img-lFYvNc3Q-1714259570469)]

#### 学习笔记以及面试真题解析

[外链图片转存中...(img-fMV1DmLL-1714259570469)]

> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/topics/618154847)收录**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值