在最初学习Java时候,经常会看到类似于“==”和equals()的比较这种说法,那时候,不知道在哪里听到的说法是,一个比较地址一个比较值。。。,显然这个说法是极其不严谨的,回过头,重新深入学习才发现了其中猫腻。

  显而易见,要说最明显的区别那就是:

  “==”是运算符,“equals()“这是方法,当然这种比较是没有太大意义的。下面就好好分析一下这两者的异同吧!

  其实,在Java语言中,并没有给出关于equals()方法的具体实现,因为该方法是定义在Object类中的,由于java中所有的类都默认继承于Object,所以所有的类都有这个方法所以他具体的作用是根据具体的业务逻辑来定义的。但也不妨看看它在Object里面到底是如何定义的:

  

  没错,就只有这三行,很明显,默认的equals方法实现是与“==”操作一样的。所以equals具体的作用是由你自己而定的,通过重写,来定义满足何种条件了,这个equals返回true,或者返回false。比如在String类中,就重写了equals方法,先通过“==”判断是否为一个引用,若“==”返回false,那么继续判断“值”是否相等,若相等,则返回true。源码如下:

  

  再看“==”,“==”这是一个二元运算符,常用于比较原生类型,简单说就是比较值类型,譬如int char之类。也不难理解,equals是方法啊,大多数情况下,对象才能调用方法,int.equals()显然是不可能的。如果“==”返回true,说明两个引用指向的地址相同。

  下面通过代码进一步分析:

  

  我们可以很清楚的看到:test1.equals(test2)返回true了,因为上面说了String类equals方法的实现规则了,当两个对象地址不一样时,比较值,如果值相等,则返回true。故此。test1.equals(test3)也返回true,这是为什么呢?因为在String类中,有常量池的存在,当new String("abc");结束后,将在栈中定义一个对象test1,并在堆内存中中开辟一块空间,将内存空间的引用赋值给test1,因为“abc”是字符串常量,所以就会去字符串常量池查看是否有abc字符串对象,没有的话分配一个空间存放abc,并且将其空间地址存入堆中new出来的空间中。然后到String test3 = "abc";在栈中定义test3,也是去字符串常量池中查找是否有此对象,结果是有的,所以直接把abc的地址赋给test3。这样看来两个地址是不一样的,但引用类型的值是相等的,所以很明显13行(“==”)输出false,11行(“equals”)输出的是true。14行输出false也是理所当然了,很明显new了两个对象,地址是不同的。

总结:  

  1. “==”常用来比较原生类型,判断两个变量或实例是不是指向同一个内存空间 ;“equals()”常用来检测对象的相等性
  2. equals的具体检测规则,由业务逻辑具体实现。如果没有重写equals,那么和“==”将无异!(常见的比如字符串的比较)

转载于:https://www.cnblogs.com/mvcq/p/8646576.html

“==”和equals()那些事相关推荐

  1. 数据库系统课设--人事管理系统

    前言 本博客内容为课设内容,在这里仅提供思路和代码给大家参考,请不要轻易抄袭,最好理解代码并自己实现题目的要求,锻炼自己的编程和逻辑能力.另外,本次的课程设计我是用命令行操作mysql数据库,使用ID ...

  2. 关于Java你不知道的那些事之等等与equals的区别

    等等与equals的区别 前言 代码一 代码二 总结 前言 我们都知道, == 是比较内存地址,equals是比较值 但是这种非常错误的一种观点 ==:比较基本数据类型的时候,比较的是值,引用数据类型 ...

  3. equals方法和hashCode方法之间的那些事(1.1)

    我们先来看一下java官方 jdk中关于equals方法和hashCode方法的介绍: 不知道读者们注意到一个细节没有,就是: 注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 ...

  4. 为什么不建议你用a.equals(b)判断对象相等

    点击关注公众号,Java干货及时送达 来源:cnblogs.com/juncaoit/p/12422752.html 一直以为这个方法是java8的,今天才知道是是1.7的时候,然后翻了一下源码. 这 ...

  5. 控制器框架Struts与策略模式那点事

    在写这篇文章之前,xxx已经写过了几篇关于改控制器框架主题的文章,想要了解的朋友可以去翻一下之前的文章 Struts1无疑是一个灰常经典的MVC框架,在Struts有前端控制器和业务控制器的概念.那么 ...

  6. 关于idea plugin测试那些事(纯手工翻译,只为打发时间,如果有错误,欢迎提建议,如果有意见,我相信别家一定更适合你)

    关于idea plugin测试那些事 让我们一起来愉快地测试自己开发的那些插件吧! 测试和修复(维护) 轻量级和重量级的测试 测试项目和测试数据目录 写测试 对于标记的测试 让我们一起来愉快地测试自己 ...

  7. Java拾遗:001 - 重写 equals 和 hashCode 方法

    2019独角兽企业重金招聘Python工程师标准>>> 重写equals方法 在Java中Object类是一个具体类,但它设计的主要目的是为了扩展,所以它的所有非final方法,都被 ...

  8. 关于 Java Collections API 您不知道的 5 件事--转

    第 1 部分 http://www.ibm.com/developerworks/cn/java/j-5things2.html 对于很多 Java 开发人员来说,Java Collections A ...

  9. 关于Java你不知道的10件事

    转载自 关于Java你不知道的10件事 作为 Java 书呆子,比起实用技能,我们会对介绍 Java 和 JVM 的概念细节更感兴趣.因此我想推荐 Lukas Eder 在 jooq.org 发表的原 ...

最新文章

  1. Centos基础优化
  2. mysql增删查操作
  3. 《研磨设计模式》chap12 观察者模式observer(2)模式介绍
  4. 看了一个月c能学java_学过一点C语言的可以自学java吗?应该怎样开始?
  5. 04_NoSQL数据库之Redis数据库:set类型和zset类型
  6. powershell 变量_极客学院:学习PowerShell变量,输入和输出
  7. java aio复制文件_java复制文件的4种方式及拷贝文件到另一个目录下的实例代码...
  8. [20180810]exadata--豆腐渣系统的保护神.txt
  9. 【廖雪峰官方网站/Java教程】注解
  10. java List 排序 Collections.sort()
  11. Tomcat发布项目时,更改浏览器地址栏图标
  12. OpenSesame:一个能够攻击fixed-pin设备的工具
  13. 史上最强之《Pyqt》写游戏
  14. 权限设计-系统登录用户权限设计
  15. 个人价值:个人价值冰山模型
  16. c语言-基本计算 pm2.5,pm2.5标准
  17. 计算机专业的电脑桌面,win7电脑桌面计算机图标不见了怎么办
  18. 淘宝女装店铺如何提升转化?
  19. 直播带货这么火,如何在小程序中实现视频通话及直播互动功能?
  20. Soul源码总结-01-20

热门文章

  1. 5年,14款近满分神作,这个独立团队打造了他们的游戏宇宙
  2. 《West Game》入围收入Tpo30的背后,SLG游戏新机会在哪?
  3. 用Unity盖房子(一):《勇者斗恶龙:建造者2》游戏功能的猜想
  4. Unity 高清渲染管线 ShaderGraph 实现简单的表面水流效果
  5. J2ME手机游戏引擎程序结构简述
  6. ERROR: Command errored out with exit status 1:
  7. 入职体检——项目列表(7项)
  8. PHP的数据类型转换
  9. Linux从零开始(二、基础命令(续)解决命令行无限输入,停不下来)
  10. CentOS之httpd与apache安装区别