没错。嘟嘟又把==号和equals 的区别给忘掉了

  ==号比较基本类型的时候比的是值,比较引用类型的时候比较的是地址。equals比较基本类型的时候。。。。

  脑子里关于这道题的答案好模糊好没有安全感

  但是请相信,看完嘟嘟这篇文章保证让你记住至少一年。记不住一年算我输。

  

  首先==号是人家java设计之初定好的,不可能改的,更何况第一句话很好理解。就硬记吧。

  至于有些人说是怎么比较基本类型的(就是关于常量池,堆内存那块的东西)嘟嘟以后有缘再研究一下。毕竟面向目的编程才是嘟嘟现在的首要目标。

  

  然后咱们瞅瞅equals是怎么比的

  

  首先equals不能比较基本类型

  基本类型在左边??不存在的。你要是写基本类型.equals编译器不报错我直播吃水果都。

  基本类型在右边??这个可以。因为嘟嘟刚才试了一下。没报错。而且debug的时候发现equals右侧的参数我就写了个1,然后就不知道被谁给自动包装成Integer类了。

  所以说equals还是不能比较基本类型。

  equals比较引用类型怎么比的

  这个问题需要追溯到万类之爹Object 类上面。Object 类里面有一个equals方法,应该算是所有equals方法的爹。

  

没错,Object类里面的equals方法应该算是最原始的equals方法,比的就是地址。

    然后我们再找几个其他的类看一下其他的类重写的equals 方法是怎么比较的

    1.String类的 equals方法:

     

也就是说String 根据自己的需要(String认为什么样的比较算是两个字符串相等)重新写了equals方法。那么什么样的两个字符串才算相等呢?上面代码很明显。(1)如果地址一样,那就是相等 (2)要是地址不相等的话:如果比较的那个对象也属于String类,我就比一下两个String对象的长度。如果长度相等,我就逐个比较每一个字符。都相等??好吧。勉强算你们两个相等了。

   

  2.咱们再看看HashMap的源代码里面是怎么定义两个HashMap相同的

    

      上图是AbstractMap.class的equals方法嘟嘟debug了一下也证明了走的是这个equals方法

      比较过程简单说一下

      (1).上来先比个地址,如果地址一样,就根本不用继续往下比了。

      (2) 如果比较的那个对象都属于Map这个类,那也不用继续往下比了。(这里嘟嘟先留个伏笔,后边有好玩的)

      (3)如果你属于Map这个类,行,咱们比比大小吧。大小一样的话可以继续往下比

    (4)到了这一步。我先将自己转化为一个一个键值对的迭代器,然后我把我的key先拿出来,问你有没有,什么?你没有?对不起,我们不合适,我们不相等。什么?你有?那你那边对应的key的value值跟我这边的一样吗?不一样?对不起,我们不合适,我们不相等。

     如果上诉的条件我们都相等,我们就相等。

        但是嘟嘟当时有个疑问?就是为什么上面源代码里面判断的是该对象是否属于Map类而不是按照HashMap LinkedHashMap等按照更细化的类型比较??

        然后嘟嘟就做了个简单的验证:

        

        结论就是。Map家族的设计者认为:如果两个Map对象地址不同,那只要你们键值对都一样,那我就认为你们相同,我也不管你是HashMap还是LinkedHashMap了。

   

        进而嘟嘟有个疑问。equals方法其实是设计者们在考虑 “怎么样才算是相等”  之后,重写的Object 里面的equals 方法。那嘟嘟自己随便瞎重写一个equals方法不是也行么??嘟嘟自己尝试了(嘟嘟随便定义了一个类A ,重写了里面的equals方法,只要参数属于String类型就算他俩相等),还特么真行。但是嘟嘟不敢保证以后你瞎写一个equals方法你项目经理打不打你。

   所以嘟嘟下面要说的就是重写equals方法要遵守的几个原则

      1.自反性:自己跟自己比一定要相等。像嘟嘟自己写的那个就不相等。

      2. 对称性:a.equals(b)和b.equals(a)必须返回的是同结果。(HashMap和LinkedHashMap对象相互比较的时候也是满足对称性的,因为HashMap和linkedHashMap的equals方法用的都是AbstractMap的)

      3.传递性:a等于b,b等于c,那么a也等于c

      4.一致性:如果a和b没改变,多次调用equals方法得到的结果相同

  

      大总结:

  ==号基本类型比较数值,引用类型比较地址

  equals 如果是Object类的equals 比较的就是地址(用的==号啊)

  但是不同的类,可能重新写了自己的equals方法(这里举一个String的一个Map就行了吧)

  但是equals 在设计的时候要遵守4个原则 (自反,对称,传递,一致)

  

  

    

  

   

  

  

  

  

写这篇博客之前,我又忘了“==”和equals的区别。的更多相关文章

  1. 上网调查一下目前流行的源程序版本管理软件和项目管理软件都有哪些?各有什么优缺点?并在Github注册账户,写一篇博客记录注册的过程。

    问题一:上网调查一下目前流行的源程序版本管理软件和项目管理软件都有哪些?各有什么优缺点?(以下内容为网上查询所得) Microsoft TFS(Team Foundation Server): 优点: ...

  2. 用JavaMail通过QQ邮箱来发送邮件(第一篇博客,备忘)

    1.先启用QQ邮箱里POP3/STMP服务:生成授权码 2.导入mail.jar包(不要用太古董的技术,你懂得) 3.注意要在代码里加上开启SSL加密的代码 4.直接上代码 import java.u ...

  3. 第一篇博客:Hello World

    2016年10月10日,双十,好日子,决定开始写第一篇博客,标题想了会,就叫Hello World 吧,哈哈^_^. 首先感谢博客园的管理们能批准我的申请,记得在14年的时候申请过一次,竟然没申请通过 ...

  4. 关于Spring MVC写的不错的几篇博客

    关于Spring MVC写的不错的几篇博客 https://my.oschina.net/kolbe/blog/509810 https://www.cnblogs.com/sunniest/p/45 ...

  5. Hello World -- 第一篇博客

    今年注定是不寻常的一年,因为技术,接触了许多大牛.通过一篇篇博文,看到了大牛们勤奋好学.孜孜不倦的精神,于是决定也开个博客,向大牛学习. 博客开了,写点什么呢?奈何肚子里墨水不多,吐出来也多是白沫,不 ...

  6. [书籍]值得纪念的第100篇博客,推荐一些看过的UI书籍

    1. 前言 来到博客园11年,这两年闲下来了才有时间写写博客,不知不觉终于写到第100篇博客了.回顾过去发表的博客,居然大部分都与UI相关.明明我本来从事的是Oracle的相关开发,明明我当初的目标是 ...

  7. 第一篇博客==>Hello_World

    1,为什么写博客? 大佬都说程序员需要写博客的说,被无数到的大佬帮我洗脑之后,慢慢也发现了写博客的好处,写博客我认为主要有以下几个作用: 1.打开博客,记录世界记录你.emmm 2.可以把自己的一些经 ...

  8. Hello World -- 第一篇博客 -- 活着的意义

    今年注定是不寻常的一年,因为技术,接触了许多大牛.通过一篇篇博文,看到了大牛们勤奋好学.孜孜不倦的精神,于是决定也开个博客,向大牛学习. 博客开了,写点什么呢?奈何肚子里墨水不多,吐出来也多是白沫,不 ...

  9. 鸿蒙内核源码分析(fork篇) | 一次调用,两次返回 | 百篇博客分析OpenHarmony源码 | v45.03

    百篇博客系列篇.本篇为: v45.xx 鸿蒙内核源码分析(Fork篇) | 一次调用,两次返回 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁在管理内 ...

随机推荐

  1. Laravel5.x的php artisan migrate数据库迁移创建操作报错SQLSTATE[42000]解决

    Laravel5.x运行迁移命令创建数据表:php artisan migrate报错. Illuminate\Database\QueryException  : SQLSTATE[42000]: ...

  2. pytorch实现yolov3(2) 配置文件解析及各layer生成

    配置文件 配置文件yolov3.cfg定义了网络的结构 .... [convolutional] batch_normalize=1 filters=64 size=3 stride=2 pad=1 ...

  3. Java逆序输出整数

    题目要求:编写方法reverseDigit,将一个整数作为参数,并反向返回该数字.例如reverseDigit(123)的值是321.同时编写程序测试此方法. 说明:10的倍数的逆序,均以实际结果为准 ...

  4. Hyperledger Fabric1.4环境搭建过程

    简单记录一下fabric版本1.4的环境搭建,运行环境为Ubuntu18.04,其中一些内容是根据官方文档整理的,如有错误欢迎批评指正. 本文只介绍最简单的环境搭建方法,具体的环境搭建解析在这里深入解 ...

  5. Storm 学习之路(八)—— Storm集成HDFS和HBase

    一.Storm集成HDFS 1.1 项目结构 本用例源码下载地址:storm-hdfs-integration 1.2 项目主要依赖 项目主要依赖如下,有两个地方需要注意: 这里由于我服务器上安装的是 ...

  6. .NetCore中三种注入方式的思考

    该篇内容由个人博客点击跳转同步更新!转载请注明出处! .NetCore彻底诠释了"万物皆可注入"这句话的含义,在.NetCore中到处可见注入的使用.因此core中也提供了三种注入 ...

  7. MediatR一个.net中简单好用的中介者模式实现方案

    MediatRGit地址:https://github.com/jbogard/MediatR 1.安装妞盖特包 一般来说只需要安装一个MediatR就行了,.net core程序需要再安装一个Med ...

  8. 数据结构与算法---树结构(Tree structure)

    为什么需要树这种数据结构 数组存储方式的分析 优点:通过下标方式访问元素,速度快.对于有序数组,还可使用二分查找提高检索速度. 缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低 ...

  9. hihoCoder 1312:搜索三·启发式搜索(A* + 康托展开)

    题目链接 题意 中文题意 思路 做这题的前置技能学习 康托展开 这个东西我认为就是在排列组合问题上的Hash算法,可以压缩空间. A*搜索. 这里我使用了像k短路一样的做法,从最终状态倒回去预处理一遍 ...

  10. web项目超时方案

    1. 场景描述 平台使用的Greenplum(内核是postgresql8.2)集群存储大数据量数据(每天一个表大概3亿),因为数据量比较大,所以在使用上有些限制,一是操作限制:二是不限制,但是到一定 ...