写这篇博客之前,我又忘了“==”和equals的区别。

  没错。嘟嘟又把==号和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个原则 (自反,对称,传递,一致)   

  

原文地址:https://www.cnblogs.com/ruishui30005921/p/11258479.html

时间: 2024-10-09 10:05:45

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

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

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

一篇博客让你了解RxJava

RxJava可以说是2016年最流行的项目之一了,最近也接触了一下RxJava,于是想写一篇博客,希望能通过这篇博客让大家能对其进行了解,本篇博客是基于RxJava2.0,跟RxJava1.0还是有很多不同的 基础知识 RxJava的核心就是"异步"两个字,其最关键的东西就是两个: Observable(被观察者) Observer/Subscriber(观察者) Observable可以发出一系列的 事件,这里的事件可以是任何东西,例如网络请求.复杂计算处理.数据库操作.文件操作等等

我的第一篇博客《Hello World》

Hello World! 大家好,这是我的第一篇博客. 作为一名程序员,为了保持优良的传统,所以就从Hello World 开始吧. 简单的介绍 关于名字 本人呢不太会起名字,试了好多个都被占用了,受一本小说影响,所以就起了这个名字. 同时呢,大家可以叫我铵静,做一个铵静的美男子哈. “高手有一颗寂寞的心,因为高手的造就本就是用寂寞堆积而成” —— <高手寂寞> 作者:兰帝魅晨 我的日常 目前主要从事Java EE企业级应用开发相关工作,业余时对网络安全比较感兴趣.周末主要是看看书,听听歌,偶

第一篇博客——基于数组的优先队列(java版)

看过园子里和CSND上那么多大牛精彩的博客后,早就按捺不住想亲手写上几篇.奈何每次坐在电脑前准备敲字的时候,立马赶到浑身不自在,无从下手.实在是因为自高考之后,大学以来,本人几乎就再没动笔写过一篇文字,写作水平退化实在严重.今天鼓起勇气开始写作博客,一方面希望通过多写慢慢地找回写作的感觉,一方面也希望通过博客和大家多多交流,共同进步. 既然是第一次试手,就写个简单易懂的内容——优先队列. 话不多说,先上代码. 1 /** 2 * @author Mr Left 3 * @version 1.0

用 Flask 来写个轻博客 (6) — (M)VC_models 的关系(one to many)

目录 目录 前文列表 扩展阅读 前言 一对多 再一次 sync db How to use 前文列表 用 Flask 来写个轻博客 (1) - 创建项目 用 Flask 来写个轻博客 (2) - Hello World! 用 Flask 来写个轻博客 (3) - (M)VC_连接 MySQL 和 SQLAlchemy 用 Flask 来写个轻博客 (4) - (M)VC_创建数据模型和表 用 Flask 来写个轻博客 (5) - (M)VC_SQLAlchemy 的 CRUD 详解 扩展阅读 S

[iOS]关于 App 混合(Hybrid)开发的优化,包括H5、Weex等(本篇博客主要针对 iOS 应用讲解,但该思想同样适用于Android)

我们知道混合开发,可以节省很多成本(时间成本,经济成本等等),所以有很多公司比较钟爱这种开发形式,今天所讲的优化方式,也是我在我们公司的应用中实际用了的,而且我写的这个优化的 SDK 已经开源到 github 上了,有兴趣的同学可以下载来看一下,有不足的地方欢迎指正.这里给出链接:https://. 转载请注明出处:http://www.cnblogs.com/shisishao/p/6830736.html -.首先,先介绍下什么是混合开发: 我们通常把移动开发分为Web.Native和Hyb

第一篇博客

现在是高一期末考试结束后的第二天,拿着稳出年级150的成绩,怕是这辈子进第一实验班(八班)无望,便默默投身到也没什么希望的数学竞赛事业中继续苟着. 这本是初一时学习信竞而创建的博客,名义还是dyhisnota250.....真的想象不到当初的我有多么...咳咳. 此篇博客用于数学竞赛之路的开端,以后一本每天都会写上一篇.坚持下来应该能够取得不错的结果吧 如果断掉的话,多年来回首这篇数学竞赛开篇之博(勃?2333),便会深感自己实力之弱和毅力之水. 嗯,就这样开始吧. 原文地址:https://w

第一篇博客:一个双色球游戏 、以及个人介绍

一.双色球小游戏 双色球类(6红1蓝): 1 package top.liaoyingpeng.bean; 2 3 import java.util.Arrays; 4 5 public class Balls { 6 private int[] red = new int[6]; 7 private int blue; 8 private BallBox makeBy; 9 10 // 全机器生成 11 protected Balls(BallBox bx) { 12 makeBy = bx;

第一篇博客,希望是一个好的开始

博客园"占座位" 因为学习专业的原因,经常浏览博客学习和解惑.在前辈们的作品中学到了很多,也感受到了很多.通过博客的方式去分享知识和记录自己的成长.这种积极向上的,乐于分享的精神,让我很受鼓舞.我时刻准备着加入这一大军的行列.于是我就注册了个账号,呵呵. 第一篇博客 经常会突发奇想的计划着怎么怎么样,却在行动的时候虎头蛇尾了,很难坚持作下去.这或许是很多人都存在的问题.在别人博客上看到:"或许写博客是一个不错的方法".通过博客,经常来记录一下自己的学习,分享一下自己