美文网首页Java程序员Java 杂谈
从源码探究JAVA的equals和==

从源码探究JAVA的equals和==

作者: 心飞麦 | 来源:发表于2018-04-01 14:37 被阅读72次

    本文脉络:先总结出三种应用场景选用equals还是==,再贴java.lang.Object类equals()方法的源码,以及重写了这个方法的派生类有哪些,以String类为例贴一个如何重写的源码。最后附上本文的参考文献和源码链接。

    JAVA的equals和==的三种应用情景

    • 基本数据类型比内容用==
    • 引用数据类型比内容用equals
    • 引用数据类型比地址用==

    以下做具体解释。

    情景一:基本数据类型比内容用==

    说明:如果想比较两个相同基本数据类型(如两个都是int类型)的变量值是否相等,则使用==运算符。对于8种基本数据类型的变量,变量直接存储的是“值”,因此在用关系操作符==来进行比较时,比较的就是 “值” 本身。注意此处不能使用equals方法,因为int是基本类型,不是对象,没有方法。

    注意:要区分int和Integer,int是java提供的8种原始数据类型之一。Java为每个原始类型提供了封装类,Integer是java为int提供的封装类。int的默认值为0,而Integer的默认值为null。

    8种基本数据类型如下。

    • 整型(四种)byte, short, int, long
    • 浮点型(两种)float, double
    • 布尔型boolean
    • 字符型char

    情景二:引用数据类型比内容用equals

    说明:如果涉及比较两个相同或不同引用类型(如两个都是String类型,或者一个是Integer类型另一个是String类型)的变量值是否相等,即本题情况,则使用equals方法。String、Date、Double、Integer、Long等类对Object类的equals方法进行了重写,比较的是内容。见本文末尾源代码。

    情景三:引用数据类型比地址用==

    前面都是想比较值是否相等,如果我们想比较引用类型的变量所指向的内存地址是否相等,则使用==运算符。
    说明:==运算符如果作用于引用类型的变量,则比较的是变量所指向的对象的地址。

    关于基本数据类型

    源码

    //java.lang.Object.equals(java.lang.Object)源码

    //derived from above

    //java.lang.String.equals(java.lang.Object)源码

    参考文献:

    1、浅谈Java中的equals和==
    2、Primitive Data Types
    3、Java.lang.Object.equals() Method
    4、Difference between == and .equals() method in Java
    5、Methods derived from: JDK / jdk / openjdk / 6-b14
    java.lang.Object.equals(java.lang.Object)

    6、java.lang.Object源码
    7、java.lang.String源码
    8、面试题:Integer和int的区别?在什么时候用Integer和什么时候用int

    相关文章

      网友评论

        本文标题:从源码探究JAVA的equals和==

        本文链接:https://www.haomeiwen.com/subject/laoocftx.html