简介

初学者常常被"= =“和‘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. 给萌新的 TS custom transformer plugin 教程——TypeScript 自定义转换器插件

    xuld/原创 Custom transformer (自定义转换器)是干什么的 简单说,TypeScript 可以将 TS 源码编译成 JS 代码,自定义转换器插件则可以让你定制生成的代码.比如删掉 ...

  2. Openstack计算Nova组件

    欢迎来到虚拟机的世界,如果我们将Openstack环境里运行在各个无力节点上的各种服务看座生命体,而不是死的指令集合,那么就是一个虚拟机的世界. Openstack的计算组件,也就是Nova项目实现了 ...

  3. docker安装mysql主从

    docker安装mysql主从 启动主库: 1.docker run --name master -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5 ...

  4. 脏牛提权CVE-2016-5195

    gcc -pthread dirtyc0w.c -o dirtyc0w 尝试使用gcc -pthread dirtyc0w.c -o dirtyc0w 编译该POC文件 gcc命令是一个编译器套件,可 ...

  5. Android Studio Run/Debug configuration error: Module not specified

    如下图,配置时没有module可选,因此报错error: Module not specified 解决方法: 1.打开根目录的settings.gradle,删除include ':app' 2.在 ...

  6. KMP 算法简单解释

    ​ 讲KMP算法,离不开BF,实际上,KMP就是BF升级版,主要流程和BF一样 ​ 不同是在匹配失败时能利用子串的特征减少回溯,利用根据子串特征生成的Next数组来减少 <( ̄︶ ̄)↗[GO!] ...

  7. javaAPI操作ES分组聚合

    连接es的客户端使用的 TransportClient SearchRequestBuilder requestBuilder = transportClient.prepareSearch(indi ...

  8. python爬取中国大学排名

    教程来自:[Python网络爬虫与信息提取].MOOC. 北京理工大学 目标:爬取最好大学网前50名大学 代码如下: import requests from bs4 import Beautiful ...

  9. 《Flutter 动画系列一》25种动画组件超全总结

    动画运行的原理 任何程序的动画原理都是一样的,即:视觉暂留,视觉暂留又叫视觉暂停,人眼在观察景物时,光信号传入大脑神经,需经过一段短暂的时间,光的作用结束后,视觉形象并不立即消失,这种残留的视觉称&q ...

  10. WeChat-SmallProgram:组件的业务 slot 的使用

    1.调用组件向自定义组件插入内容,使用  slot 在自定义模板中有一对 <view><slot></slot></view> 这里是干什么用的呢? 在 ...