java中的==和equals的区别?

看上面的代码,输出的结果是:

true

false

true

true

1.为什么会有上面的区别呢?==和equals比较的到底是什么呢?

搞清楚两者的区别其实很简单,在thinking in java 中有一句话,需要我们好好体会下:"关系操作符生成的是一个boolean结果,它们计算的是操作数的值之间的关系"。

首先我们都知道==就是一个关系操作符,那么==比较的就是操作数值之间是否相等。当操作数值的类型是基本类型的时候,操作的值就是变量存储的值,例如int a = 10,int b = 10;很明显,a,b的值都是10,因此a==b的结果是true。当操作数的类型不是基本类型的时候,例如是引用类型的变量,例如 Stirng str1 = new String("123") String str2 = new String("123");当判断 str1==str2,我们还是根据上面那句话来判断,明确str1和str2的值到底是不是一样即可。str1是一个引用类型,指向的是一个String对象,在内存str1存储的值是一个地址,这个地址记录了对象在堆内存中的存储地址,那么很明显,str1和str2指向两个不同的对象,即str1和str2的值不同。所以str1==str2的结果是false.

2.equals方法的特殊之处

很明确,equal是一个方法,是Object类中定义的一个方法,看下发方法的构成:

很明显,equals最终比较的是两个对象引用的值,那么str1.equals(str2)的结果应该是false,可运行结果是true,这是怎么回事呢?是不是上面那句话有问题呢?不是的,那是因为String这个类继承了Object类,并且重写了equals方法。看下重写的equals方法

从代码很容易知道,String的equals方法,首先判断两个对象是否相同,如果不同,比较两个字符串的值是否相同。如果相同返回true.因此str1.equals(str2)的结果是true。同样的诸如Double,Date,Integer等,都对equals方法进行了重写用来比较指向的对象所存储的内容是否相等,所以equals()比较,需要具体情况具体分析。

3.总结

==,如果是基本类型,则直接比较存储的值是否相等,如果是引用类型,则比较所指向的对象的地址是否相同

equals方法,基本类型不能使用equals,如果未对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址,如果进行了重写,则根绝重写的方法具体情况具体分析。

最新文章

  1. Python~迭代
  2. csuoj 1335: 高桥和低桥
  3. 4、C#基础整理(if语句经典习题)
  4. sql server中的decimal或者numeric的精度问题
  5. CentOS7 列出服务和对应端口
  6. wpf 计算器布局练习
  7. OnlineJudge 离线题库采集
  8. 爆出错误:The Geometry has no Z values
  9. java中文乱码解决之道(五)—–java是如何编码解码的
  10. C++类成员常量
  11. 基于jenkins搭建一个持续集成服务器
  12. ASCII十进制转字符串的方法
  13. (二)Maven的安装与环境配置
  14. mssql sqlserver 索引专题
  15. 二叉搜索树的第k个节点
  16. gevent实现生产者消费者
  17. 马凯军201771010116《面向对象程序设计(java)》第一周学习总结
  18. 《算法》第四章部分程序 part 4
  19. #Plugin 环形loading插件
  20. git clone 某个分支或者所有分支

热门文章

  1. 认识http客户端
  2. MySQL 存储过程参数IN OUT INOUT区别
  3. js日期转换Fri Oct 31 18:00:00 UTC+0800 2008转换为yyyy-mm-dd
  4. phonegap二维码扫描插件
  5. Servlet学习笔记02——什么是http协议?
  6. python之doctest的用法
  7. MLT教程:从BXL文件导入Altium Designer原理图封装和PCB封装
  8. springboot搭建环境访问Controller层返回404
  9. POJ:2429-GCD & LCM Inverse(素数判断神题)(Millar-Rabin素性判断和Pollard-rho因子分解)
  10. js简单的获取与输出