没错。嘟嘟又把==号和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. git(一)

    一.邮件的格式 抄送:需要知道这件事的人 内容: 大家好: 我是xxx,附件内容是我的简历,请查收,有问题可以随时联系我susun|开发工程师电话:1231xxxxx31地址:xxxxxx联系电话(公 ...

  2. hadoop之hive集合数据类型

    除了string,boolean,date等基本数据类型之外,hive还支持三种高级数据类型: 1.ARRAY ARRAY类型是由一系列相同数据类型的元素组成,这些元素可以通过下标来访问.比如有一个A ...

  3. 30255Java_5.5 GUI

    GUI GUI的各种元素(如:窗口,按钮,文本框等)由Java类来实现 1.AWT 使用AWT所涉及的类一般在java.awt包及其子包中 AWT(Abstract Window Toolkit)包括 ...

  4. bean 解析、注册、实例化流程源码剖析

    本spring源码的版本:4.3.7 Spring bean的加载主要分为以下6步: (1)读取XML配置文件 (2)XML文件解析为document文档 (3)解析bean (4)注册bean (5 ...

  5. ZooKeeper —— 单机环境和集群环境搭建

    一.单机环境搭建 1.1 下载 下载对应版本Zookeeper,这里我下载的版本3.4.14.官方下载地址:https://archive.apache.org/dist/zookeeper/ # w ...

  6. linux 下 设置 MySQL8 表名大小写不敏感方法,解决设置后无法启动 MySQL 服务的问题

    在安装完成之后,初始化数据库之前,修改 my.cnf 打开mysql配置文件 vim /etc/my.cnf 在尾部追加一行 lower_case_table_names=1 并保存,然后再初始化数据 ...

  7. 【设计模式】行为型09访问者模式(Visitor Pattern)

    学习地址:https://blog.csdn.net/u012124438/article/details/70537203(参考了很多博客,只有这个讲明白了核心点) 访问者模式(Visitor  P ...

  8. CI框架中的奇葩

    今天在win下开发,使用ci框架,本来是没有任何问题,然后转向了mac上开发,结果出现了个奇葩的问题,就是在ci框架中,控制器命名以"Admin_"为前缀的,在url中,控制器也必 ...

  9. node.js中模块,require

    在php,C++中都有命名空间的概念,命名空间主要是用来解决引入文件存在函数,类,变量重名的问题,在node.js中,没有命名空间这么复杂的概念,在node中,有模块的概念,也就是将功能性的代码都放在 ...

  10. (2)Linux文件和目录操作命令

    简单就是高效 pwd cd -/~/.. tree–a/d/f/i/L mkdir–p/v/m touch ls –l/a//i/h/F cp –r/p/d/a mv rm –f/r/i rmdir ...