专栏首页后端Coderjava面试篇之equals和==的区别究竟在哪?
原创

java面试篇之equals和==的区别究竟在哪?

打算今天分享的内容其实是和上篇的理论内容有点关系,和接下来需要分享的文章相关的,这篇文章我们就说下引用和值之间的区别,也是java面试会问到的点,掌握这个出去面试也不再为难了,搬好小板凳,继续咯。

我们先说下java中两种类型吧,做下铺垫内容,避免看到下面的内容时一头雾水,不知所措,java由于是面向对象的一门高级语言(相对于汇编语言来说的),java分为基本数据类型和引用类型,基本数据类型基本上是int,char,boolean等8种常用的类型,另外一种就是引用类型了。

好了,==在基本数据类型和引用类型做比较时是不一样的,基本类型比较的是值是否相同,对于引用类型来说比较的当然是引用是否一样了。为了加深我们对其的理解程度,附上一段代码,希望你可以明白。

public static void main(String[] args) {
    String x="hello";
    String y="hello";
    String z=new String("hello");
    System.out.println(x==y);//true
    System.out.println(x==z);//false
    System.out.println(x.equals(y));//true
    System.out.println(x.equals(z));//true
}

自己将代码写入到自己的IDE环境里进行运行一下,一目了然,由于x,y指向的是同一个对象引用,所以==在进行引用类型判断是true,但是z对象由于是new String("hello"),从新在堆空间里进行了新的一块内存的划分,导致引用对象的地址不一样了,所以x==z就是false。这样你明白了吧。

下面我们说下equals()方法了,其实equals()方法也是对引用进行比较的,看下代码先。

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

在这你可能会有点疑问为什么String对象在用equals()方法进行判断时,返回的是true呢?因为String重写了equlas方法,看下String重写的equals方法的代码,你就明白了。

public boolean equals(Object anObject) {        if (this == anObject) {            return true;        }        if (anObject instanceof String) {            String anotherString = (String)anObject;            int n = value.length;            if (n == anotherString.value.length) {                char v1[] = value;                char v2[] = anotherString.value;                int i = 0;                while (n-- != 0) {                    if (v1[i] != v2[i])                        return false;                    i++;                }                return true;            }        }        return false;    }

其实,说到这里,我们今天要分享的这篇文章就结束了,现在还记得电话面试时面试官问到的这些内容,掌握这些内容,再面试这类问题时就不会觉得很尴尬,今天想分享的就是这些了,希望可以帮助到阅读这篇文章的你,关注微信号后端Coder,喜欢的可以分享和转发文章。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 线程的通信和封闭

    要想实现线程之间的协同, 如: 线程先后执行顺序, 获取某个线程的执行结果等, 涉及线程之间的相互通信, 分为下面四类

    CodingDiray
  • 线程状态

    代码测试 第一种状态切换 - 新建 -> 运行 -> 终止 // 第一种状态切换 - 新建 -> 运行 -> 终止 System.out.print...

    CodingDiray
  • 学编程数学到底有多重要?线性代数能否视为一门程序语言呢?

    线性代数告诉我们,“行!按我的语法构造一个矩阵,再按矩阵乘法规则去乘你们的图像,我保证结果就是你们想要的”。

    老九君
  • 快速搭建团队的GitLab

    研发效能的其实端是代码仓的管理和统一维护,通过统一的私有化的Git托管服务实现代码的内部有限共享。代码仓在研发效能的提升中占据很重要的地位,这是DevOps工具...

    Criss@陈磊
  • 线程池应用及实现原理剖析

    CodingDiray
  • Java 中如何模拟真正的同时并发请求?

    有时需要测试一下某个功能的并发性能,又不要想借助于其他工具,索性就自己的开发语言,来一个并发请求就最方便了。

    芋道源码
  • Java程序运行原理分析

    线程独占: 每个线程都会有它独立的空间,随线程的生命周期而创建和销毁 线程共享: 所有线程都能访问这块内存数据,随虚拟机或GC而创建和销毁 方法区

    CodingDiray
  • 人工智能IDE编程插件,提升编程效率的好帮手

    平时写代码的时候多少会依赖编辑器里面的代码补全,敲几个字母就能补全一整个词。可是这么多年过去了,为什么代码补全还是像最开始那样,只能限定于一个词,而且毫无意义地...

    JAVA葵花宝典
  • python的itertools模块

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    于小勇
  • Java中实现线程的方式

    Java中实现多线程的方式的方式中最核心的就是 run()方法,不管何种方式其最终都是通过run()来运行。

    CodingDiray

扫码关注云+社区

领取腾讯云代金券