转自:http://www.javaresearch.org/html/article/46110.htm
一句话概括:==比较的是两个对象的引用(即内存地址)是否相等,而equals()比较的是两个对象的值(即内存地址里存放的值)是否相等。当然equals()在个别类中被重写了那就例外了。

详细论述:eqauls 与 = =之异同

1)比较方式角度:

= =是面向过程的操作符;equals是面向对象的操作符

= =不属于任何类,equals则是任何类(在Java中)的一个方法;

我们可以1)Primitive1 (基本类型)= = Primitive2(基本类型);

2)Object Reference1(对象引用)= = Object Reference2(对象引用)

3)Object Reference1 (对象引用) .equals(Object Reference2 (对象引用))

这三种比较

但却不能Primitive1 (基本类型).equals( Primitive2(基本类型));

对于基本类型,没有面向对象中发送消息一说,自然也不会有

方法成员。

2)比较目的角度:

1) 如果要比较两个基本类型是否相等,请用= =;

2) 如果要比较两个对象引用是否相等,请用= =;

3) 如果要比较两个对象(逻辑上)是否一致,请用equals;

对两个对象(逻辑上)是否一致的阐释:

有人会问:在C++中, 比较两个对象相等不是也可以用==吗?我知道您是指运算符重载,但是很遗憾,Java中不支持运算符重载(java中亦有重载过运算符,他们是“+”,“+=”,不过也仅此两个,而且是内置实现的);所以,对象的是否相等的比较这份责任就交由 equals()来实现 。

这个“逻辑上”其实就取决于人类的看法,实际开发中,就取决于用户的需求;

第三节:equals()缘起:

equals()是每个对象与生俱来的方法,因为所有类的最终基类就是Object(除去Object本身);而equals()是Object的方法之一。

我们不妨观察一下Object中equals()的source code:

public boolean equals(Object obj) {

return (this == obj);

}

注意 “return (this == obj)”

this与obj都是对象引用,而不是对象本身。所以equals()的缺省实现就是比较

对象引用是否一致;为何要如此实现呢? 前面我们说过:对象是否相等,是由我们的需求决定的,世界上的类千奇百怪(当然,这些类都是我们根据模拟现实世界而创造的),虽然Object是他们共同的祖先,可他又怎能知道他的子孙类比较相等的标准呢?但是他明白,任何一个对象,自己总是等于自己的,何谓“自己总是等于自己”呢,又如何判断“自己总是等于自己”呢?一个对象在内存中只有一份,但他的引用却可以有无穷多个,“对象自己的引用1=对象自己的引用2”,不就能判断“自己总是等于自己”吗?所以缺省实现实现自然也就是

“return (this == obj)”;

而到了我们自己编写的类,对象相等的标准由我们确立,于是就不可避免的要覆写

继承而来的public boolean equals(Object obj);

如果您有过编覆写过equals()的经验(没有过也不要紧),请您思考一个问题:

“两个对象(逻辑上)是否一致”实际上是比较什么?没错,或许您已脱口而出:

就是对象的属性(即field,或称数据成员)的比较。方法是不可比较的哦。(这个问题是不是有些弱智呢?哈哈)

第四节:对一个推论的思考

推论如下:一言以蔽之:欲比较栈中数据是否相等,请用= =;

欲比较堆中数据是否相等,请用equals;

因为(根)基本类型,(根)对象引用都在栈中; 而对象本身在堆中;

这句话又对又不对,问题出在哪,就是“数据”二字,先看栈中,数据或为基本类型,或为对象引用,用==比较当然没错;但是堆中呢?对象不是堆中吗?不是应该用equals比较吗?可是,我们比较的是堆中“数据”,堆中有对象,对象由什么构成呢?可能是对象引用,可能是基本类型,或两者兼而有之。如果我们要比较他们,该用什么呢,用”equals()”?不对吧,只能是”= =”!所以正确的结论是:欲比较栈中数据是否相等,请用= =; 欲比较堆中数据是否相等,请用equals;

因为(根)基本类型,(根)对象引用都在栈中(所谓“根”,指未被任何其他对象所包含); 而对象本身在堆中。

Java中equals和等号的区别,觉着不错相关推荐

  1. Java中equals()方法和==的区别分析

    Java中equals方法和==的区别分析 equals(Object obj)方法,将对象与传入的obj进行比较,相等返回true,否则返回false.equals方法和"==" ...

  2. JAVA 中equals()与==的区别

    原文地址:http://www.chineselinuxuniversity.net/articles/29594.shtml 值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存 ...

  3. Java中equals()和“==”区别

    Java中equals()和"=="区别 1.对于基础数据类型,使用"=="比较值是否相等: 2.对于复合数据类型(类),使用equals()和"== ...

  4. 关于java中equals与==的区别的小实验

    java中equals与==经常容易混淆,简单一点说就是equals比较的是值是否相等,是一种方法,==比较的两个对象在JVM中的地址,是一种操作符. 做了几个小实验比较结果. 实验一: String ...

  5. 【翻译】Java中String, StringBuffer, StringBuilder的区别

    2019独角兽企业重金招聘Python工程师标准>>> String 是  Java 中最重要的类之一,并且任何刚开始做Java编程的人,都会 用String定义一些内容,然后通过著 ...

  6. java 中long和Long的区别

    转载自: https://blog.csdn.net/z1571978029/article/details/79059480 前言 最近在学习java,接触到了long类型,发现网上这方面的资料较乱 ...

  7. Java中Set Map List 的区别

    java中set map list的区别: 都是集合接口 简要说明 set --其中的值不允许重复,无序的数据结构 list   --其中的值允许重复,因为其为有序的数据结构 map--成对的数据结构 ...

  8. Java中Long和long的区别

    转载自: https://blog.csdn.net/z1571978029/article/details/79059480 前言 最近在学习java,接触到了long类型,发现网上这方面的资料较乱 ...

  9. java中的异常种类和区别以及处理机制和区别

    java中的异常种类和区别以及处理机制和区别 按照异常需要处理的时机分为编译时异常(也叫强制性异常)也叫 CheckedException 和运行时异常(也叫非强制性异常)也叫 RuntimeExce ...

最新文章

  1. Duplicate entry '0' for key 'PRIMARY'_Spring Batch
  2. ​数字政府发展指数排名出炉!上海、浙江、北京位列前三,你的城市排第几?(附报告全文下载)...
  3. 如何在VB例程中接收自定义消息
  4. web---Tomca安装,Server安装,Tomcat配置
  5. Git提交到多个远程仓库
  6. 2021牛客多校7 - xay loves trees(dfs序+主席树-标记永久化)
  7. body 没有被撑开_body没有高度设置背景色为什么可以全屏显示?
  8. P7115-[NOIP2020]移球游戏【构造】
  9. 全球数据库--基金/管理产品--分类/行业平均
  10. mysql 5.7 slow_mysql 5.7 解决 set global slow_query_log=on;报错
  11. Interface Project
  12. html5 动态图表FineReport优化报表取数
  13. 机器学习实战-Python机器学习项目实战
  14. KiCad常用元器件库
  15. 计算机物理仿真,仿真物理实验室初中完整版
  16. 简单实现图片转彩色字符画
  17. python爬楼梯问题_python解决上楼梯问题
  18. 2020秋招阿里测试开发一面
  19. 计算机程序漏洞用英语怎么说,安全漏洞的英文
  20. css固定图片大小 vue_css3 实现图片等比例放大与缩小

热门文章

  1. css3+html5——新闻列表设计
  2. 【摘要】HinDroid:一个基于异质图的安卓恶意软件智能检测系统
  3. pytorch训练与测试爆显存问题的解决
  4. java jackson2.6_Jackson 2 - Convert Java Object to JSON and JSON String to Object
  5. Java设计模式 -2- 原型设计模式
  6. Windows 10随机性死机怎么办?
  7. Windows通过route命令设置可同时访问内网和外网
  8. iOS 数字时钟(时间显示并持续更新)
  9. Synopsys验证VIP学习笔记(6)检查和打印信息控制
  10. 基于Python实现的图的同构算法