简介

初学者常常被"= =“和‘equals ’所折磨,为什么,因为他们的大概意思相同,都是比较两个对象是否相等,而又不搞不清他们的具体比较两个对象相等的原理是什么,所以经常搞混淆,接下来我们就去仔细的剖析他们,真正理解什么时候用”= =",什么时候用equals
先统一看一下他们两个的区别,知道区别后再仔细研究他们的原理

区别:

==:它存在两个情况
1.当他比较两个基本类型时,判断的时两个基本类型的类型和值是否相同
2.当他比较两个引用类型是,判断的时两个引用类型的类型和地址是否相同

图解:

equels:最基本的equels方法其实就是= =,也就是说,最基本的equels也存在两个情况
1.当他比较两个基本类型时,判断的时两个基本类型的类型和值是否相同
2.当他比较两个引用类型是,判断的时两个引用类型的类型和地址是否相同
也就是说最基本的equels方法和= =完全一样

注意点:

请看清楚,我这里说的最基本的equels方法,什么是最基本的equels方法?

在这里我们要知道一个知识点:equels方法是Object类的方法,我们再代码中写的所有Class类都继承了Object的equels方法,所以我称Object类的equels方法是最基本的equels方法

源码分析:

我们再来看一下Object类的equels方法的源码

这下明白了吧!Object类的equels方法是直接点用了‘= =’,所以一开始我说:最基本的equels方法和==完全一样
那我们知道,继承的一大特点就是实现了java语言的多样性,而方法重写则是java语言多样性的实现原理之一。问题的重要点就在这里,继承Object类的子类对equels的重写导致了equels和= =的不同。具体哪里不同,这就要看怎么重写了。
给大家看一下一个重写了的,比如String,看图:

String的重写equals方法流程是这样的
第一步:判断引用地址是否相等,引用地址相等说明他们是同一个对象,说明值肯定相同,返回true
第二部:判断对象类型是否相同,类型不同,直接返回false
第三步:循环两个对象的字符,一一对比是否相同,都相同说明值相同,返回true
所以String重写的equals方法的总目的就是判断两个对象的值是否相同。

总结

所以总结下来就是说,==和我们日常用的equals方法哪里不一样,我们要去看他们怎么重写的equals方法,看完之后才能知道equals具体是怎么比较的。

一定要看的干货

深入理解== 和 equals 的本质区别的更多相关文章

  1. Java学习从菜鸟变大鸟之一 hashCode()和equals()的本质区别和联系

    在学习java,根据视频做实例的过程中,对equals和hashcode两个方法理解稍微深刻一点,主要是它们两个很容易混淆,容易出错,自己又通过网上的资料学习,和大家分享 equals()方法 equ ...

  2. 《面试经典系列》- 从底层理解==和equals的区别

    前言 在我们Java面试中,基础知识基本上比定会考核的点,而“==和equals的区别”则是面试官最喜欢.最经常问的问题. 但我们看了不少的文章.解释,总是一头雾水.一知半解的,往往很容忘记.今天,我 ...

  3. 从equals和==的区别开始

    今天我要谈的,不是具体的一个小程序的设计,也不是什么高大上的遗传算法群体智能什么什么的理念.今天我想就非常简单的一个问题,深入地解释一些东西,把自己的一些看法传达给大家.我相信,认真看下去,大家会有所 ...

  4. [转] equals和==的区别小结

    ==: == 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象.比较的是真正意义上的指针操作. 1.比较的是操作符两端的操作数是否是同一个对象 ...

  5. equals和==的区别小结

    ==: == 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象.比较的是真正意义上的指针操作. 1.比较的是操作符两端的操作数是否是同一个对象 ...

  6. ==与equals()区别

    equals和==的区别? 经常被简单的理解为equals方法用来比较两个对象是否相同, 而==比较运算符用来比较两个基本数据类型的数值是否相同. 这样的理解无可厚非,但还要透过简单看看本质,才会更清 ...

  7. 【转】equals和==的区别

    ==: == 用于比较两个对象的内存地址值(引用值)是否相等,也就是比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象.比较的是真正意义上的指针 ...

  8. java equals和==的区别

    大概说equals和==都比较的是什么: 1. boolean tem = a == b; 首先==比较的肯定是地址,从堆栈的角度说也就是说==比较的是栈上面的内容.因为栈是用来存放地址或是java中 ...

  9. 【转】HTTP POST GET 本质区别详解

    一 原理区别 一般在浏览器中输入网址访问资源都是通过GET方式:在FORM提交中,可以通过Method指定提交方式为GET或者POST,默认为GET提交 Http定义了与服务器交互的不同方法,最基本的 ...

随机推荐

  1. (转)协议森林11 涅槃 (TCP重新发送)

    协议森林11 涅槃 (TCP重新发送) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! TCP协议是一个可靠的协议.它通过重新发送 ...

  2. 左侧带三角的Card css支持hover阴影

    <div class="inputReportIndex"> <div class="inner"> <div class=&qu ...

  3. layui的弹出层的title的自定义html

       layui的弹出层的title的自定义html //在这里面输入任何合法的js语句 layer.open({ type: 1 //Page层类型 ,area: ['500px', '300px' ...

  4. tensorflow一些API的基本理解

    1.tf.Session self._session = None opts = tf_session.TF_NewSessionOptions(target=self._target, config ...

  5. c# 对SOAP返回XML字符串的解析方法

    <SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP:Head ...

  6. Cisco 综合配置(四)

    MSTP+HSRP 模式 为实现路由的备用.冗余: VLAN10,20 流量在CO-SW1上为active状态,在CO-SW2 上为standby状态, VLAN30,40 流量在CO-SW1上为st ...

  7. mysql存储过程简单用法

    show procedure status 查看所有存储过程 <!--  简单存储过程  --> 先将结束符改成// delimiter // create procedure query ...

  8. 牛客网剑指offer【Python实现】——part2

    不用加减乘除做加法 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 两个数异或:相当于每一位相加,而不考虑进位: 两个数相与,并左移一位:相当于求得进位: 将上述两步的 ...

  9. 使用IDEA操作Hbase API 报错:org.apache.hadoop.hbase.client.RetriesExhaustedException的解决方法:

     使用IDEA操作Hbase API 报错:org.apache.hadoop.hbase.client.RetriesExhaustedException的解决方法: 1.错误详情: Excepti ...

  10. Hadoop调度器

    一.FIFO调度器(先进先出调度) 上图为FIFO调度器的执行过程示意图.FIFO Scheduler是最简单也是最容易理解的调度器,它缺点是不适用于共享集群.大的应用可能会占用所有集群资源,这就导致 ...