Java 里面的 == 和equals的坑是在是太多了,即使做了多年java开发的程序员也不一定就能准确说出 a == b 或 a.equals(b) 这样简单的问题的答案。

请看下面这26道关于Long 和 bigdecimal 的相等比较,看看你是否可以准确说出每行代码的输出结果呢?

答案在文末,请先看题:

关于Long的相等比较:

1、System.out.println(Long.valueOf("9999999").equals(new Long(9999999L))); 输出:true/false?

2、System.out.println(Long.valueOf("9999999") == new Long(9999999L)); 输出:true/false?

3、System.out.println(Long.valueOf("1") == new Long(1L)); 输出:true/false?

4、System.out.println(1L == new Long(1L)); 输出:true/false?

5、System.out.println(new Long(1L) == new Long(1L)); 输出:true/false?

6、System.out.println(999999L == new Long(999999L)); 输出:true/false?

7、System.out.println(999999L == Long.valueOf("999999")); 输出:true/false?

8、System.out.println(Long.valueOf("999999") == Long.valueOf("999999")); 输出:true/false?

9、System.out.println(Long.valueOf("1") == Long.valueOf("1")); 输出:true/false?

10、System.out.println(Long.valueOf("127") == Long.valueOf("127")); 输出:true/false?

11、System.out.println(Long.valueOf("128") == Long.valueOf("128")); 输出:true/false?

12、System.out.println(Long.valueOf("-128") == Long.valueOf("-128")); 输出:true/false?

13、System.out.println(Long.valueOf("-129") == Long.valueOf("-129")); 输出:true/false?

关于BigDecimal的相等比较:

1、System.out.println(BigDecimal.valueOf(0) == BigDecimal.ZERO); 输出:true/false?

2、System.out.println(BigDecimal.valueOf(new Long(0)) == BigDecimal.ZERO); 输出:true/false?

3、System.out.println(BigDecimal.valueOf(0.0) == BigDecimal.ZERO); 输出:true/false?

4、System.out.println(BigDecimal.valueOf(0) == BigDecimal.valueOf(0)); 输出:true/false?

5、System.out.println(BigDecimal.valueOf(11) == BigDecimal.valueOf(11)); 输出:true/false?

6、System.out.println(BigDecimal.valueOf(10) == BigDecimal.valueOf(10)); 输出:true/false?

7、System.out.println(BigDecimal.valueOf(11).equals(BigDecimal.valueOf(11))); 输出:true/false?

8、System.out.println(BigDecimal.valueOf(9999).equals(BigDecimal.valueOf(9999))); 输出:true/false?

9、System.out.println(BigDecimal.valueOf(9999.00).equals(BigDecimal.valueOf(9999.00))); 输出:true/false?

10、System.out.println(BigDecimal.valueOf(9999.0).equals(BigDecimal.valueOf(9999.00))); 输出:true/false?

11、System.out.println(BigDecimal.valueOf(9999.0).equals(new BigDecimal(9999.00))); 输出:true/false?

12、System.out.println(BigDecimal.valueOf(0.0).equals(BigDecimal.ZERO)); 输出:true/false?

13、System.out.println(BigDecimal.valueOf(9999.0).compareTo(new BigDecimal(9999.00)) == 0); 输出:true/false?

---------------------------------------------------------------------------------------------------------------------------------------------------

答案来了

---------------------------------------------------------------------------------------------------------------------------------------------------

10

9

8

7

6

5

4

3

2

1

请看答案:

Long

1、System.out.println(Long.valueOf("9999999").equals(new Long(9999999L))); 输出:true

2、System.out.println(Long.valueOf("9999999") == new Long(9999999L)); 输出:false

3、System.out.println(Long.valueOf("1") == new Long(1L)); 输出:false

4、System.out.println(1L == new Long(1L)); 输出:true

5、System.out.println(new Long(1L) == new Long(1L)); 输出:false

6、System.out.println(999999L == new Long(999999L)); 输出:true

7、System.out.println(999999L == Long.valueOf("999999")); 输出:true

8、System.out.println(Long.valueOf("999999") == Long.valueOf("999999")); 输出:false

9、System.out.println(Long.valueOf("1") == Long.valueOf("1")); 输出:true

10、System.out.println(Long.valueOf("127") == Long.valueOf("127")); 输出:true

11、System.out.println(Long.valueOf("128") == Long.valueOf("128")); 输出:false

12、System.out.println(Long.valueOf("-128") == Long.valueOf("-128")); 输出:true

13、System.out.println(Long.valueOf("-129") == Long.valueOf("-129")); 输出:false

总结

对于Long的比较,不要用等号,规律太多,根本记不住。而equals方法是非常安全的,可以放心用equals进行相等的比较。

BigDecimal

1、System.out.println(BigDecimal.valueOf(0) == BigDecimal.ZERO); 输出:true

2、System.out.println(BigDecimal.valueOf(new Long(0)) == BigDecimal.ZERO); 输出:true

3、System.out.println(BigDecimal.valueOf(0.0) == BigDecimal.ZERO); 输出:false

4、System.out.println(BigDecimal.valueOf(0) == BigDecimal.valueOf(0)); 输出:true

5、System.out.println(BigDecimal.valueOf(11) == BigDecimal.valueOf(11)); 输出:false

6、System.out.println(BigDecimal.valueOf(10) == BigDecimal.valueOf(10)); 输出:true

7、System.out.println(BigDecimal.valueOf(11).equals(BigDecimal.valueOf(11))); 输出:true

8、System.out.println(BigDecimal.valueOf(9999).equals(BigDecimal.valueOf(9999))); 输出:true

9、System.out.println(BigDecimal.valueOf(9999.00).equals(BigDecimal.valueOf(9999.00))); 输出:true

10、System.out.println(BigDecimal.valueOf(9999.0).equals(BigDecimal.valueOf(9999.00))); 输出:true

11、System.out.println(BigDecimal.valueOf(9999.0).equals(new BigDecimal(9999.00))); 输出:false

12、System.out.println(BigDecimal.valueOf(0.0).equals(BigDecimal.ZERO)); 输出:false

13、System.out.println(BigDecimal.valueOf(9999.0).compareTo(new BigDecimal(9999.00)) == 0); 输出:true

总结

对于BigDecimal的比较,不用用 == 也不要用equals,规律太多,根本记不住,而应该用compareTo方法。

-----------------------------------------------------------------------------------------------------------------------------------------------

推荐阅读:

做了这么多年java开发,关于 Long 和 BigDecimal 的相等比较,你可不一定能准确回答下面 26 个问题的更多相关文章

  1. 大学同学做Java开发比我多5K,八年老Android只会crud该转Java吗?

    最近在网上看到这样一个帖子: 做了八年Android开发,感觉这块做着也挺没意思,日常工作就是做一些架构优化,质量数据监控,改一改构建脚本,最主要的是业务负责人没有一个是做客户端的,都是后端的人. 最 ...

  2. 转载:做Java开发这一年 (火龙果软件)

    转载:http://www.uml.org.cn/success/201410205.asp 从去年到现在,从.NET转向Java开发(只是因为项目原因,绝对与平台好坏没有关系)差不多有一年的时间了. ...

  3. 所有做java开发的都是些垃圾

    所有做java开发的都是些垃圾,再垃圾的框架,只要有人用,对java程序员来说那就是高性能,高可用,解耦的,非常优秀的一款框架.属于吃屎都吃的津津有味.java里的框架都是垃圾,连一个不错的都没有.比 ...

  4. 【20K必备知识点】北上广Java开发月薪20K往上,该如何做,需要会写什么

    有人回答说这只能是大企业或者互联网企业工程师才能拿到.也许是的,小公司或者非互联网企业拿两万的不太可能是码农了,应该已经转管理.还有区域问题,这个不在我的考虑范围内,因为除了北上广深杭,其他地方也很难 ...

  5. java突破------一撸到底(做Java开发,遇到瓶颈是保持现状还是寻求突破?)

    java突破------一撸到底(做Java开发,遇到瓶颈是保持现状还是寻求突破?) 很多人做Java开发2.3年之后,都会觉得自己遇到了瓶颈.什么都会又什么都不会,如何改变困境,为什么很多人写了7. ...

  6. 北上广Java开发月薪20K往上,该如何做,需要会写什么

    这个问题可能很多人会说这只是大企业或者互联网企业工程师才能拿到.也许是的,小公司或者非互联网企业拿两万的不太可能是码农了,应该已经转管理.还有区域问题,这个不在我的考虑范围内,因为这方面除了北上广深杭 ...

  7. 使用Eclipse-Maven-git做Java开发(3)--Eclipse的安装和配

    使用Eclipse-Maven-git做Java开发(3)--Eclipse的安装和配 https://my.oschina.net/songxinqiang/blog/474530

  8. 一个老牌程序员说:做Java开发,怎么可以不会这 20 种类库和 API

  9. 《阿里巴巴Java开发手册v1.2》解析(编程规约篇)

    之前在乐视天天研究各种底层高大上的东西,因为我就一个人,想怎么弄怎么弄.如今来了新美大,好好研读一下<阿里巴巴Java开发手册v1.2>.还要对这么看似简单的东西解析一番.毕竟现在带团队, ...

随机推荐

  1. SSM-MyBatis-07:Mybatis中SqlSession的insert和delete底层到底做了什么

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 先点进去看一下insert方法 用ctrl加鼠标左键点进去看 发现是一个接口SqlSession的方法,没有实 ...

  2. Java 精简Jre jar打包成exe

    #开始 最近几天都在忙一个事情,那就是尝试精简jre,我想不明白为什么甲骨文官方不出exe打包工具... 网络上精简jre的文章很多,但是原创的似乎没几个,绝大多数都是转发同一个博客, 这里借鉴了不少 ...

  3. Spring Security-- 验证码功能的实现

    spring security4 添加验证码 http://www.itwendao.com/article/detail/165400.html http://www.itdadao.com/art ...

  4. [爬虫]爬虫时碰到的IOError: [Errno ftp error] [Errno 10060]错误的原因以及解决方法

    IOError: [Errno ftp error] [Errno 10060] 原因是爬取页面过快造成暂时被网站ban掉的情况,设置time.sleep(1)就好,后来发现ban的时间不定,就自己动 ...

  5. python实现简单的一个刷票点赞功能

    投票网址:http://best.zhaopin.com/?sid=121128100&site=sou 在以上网址中找到"XXX技术有限公司",通过Python进行刷票. ...

  6. counter.go

    package engine func (engine *Engine) NumTokenIndexAdded() uint64 {     return engine.numTokenIndexAd ...

  7. 十条有用的GO技术

    十条有用的 Go 技术 这里是我过去几年中编写的大量 Go 代码的经验总结而来的自己的最佳实践.我相信它们具有弹性的.这里的弹性是指: 某个应用需要适配一个灵活的环境.你不希望每过 3 到 4 个月就 ...

  8. 用Java为Hyperledger Fabric(超级账本)编写区块链智能合约链代码

    编写第一个 Java 链代码程序 在上一节中,您已经熟悉了如何构建.运行.部署和调用链代码,但尚未编写任何 Java 代码. 在本节中,将会使用 Eclipse IDE.一个用于 Eclipse 的 ...

  9. iOS指纹识别Touch ID的安全性探讨

    苹果公司在 iPhone 5s 的发布会上公布了全新的指纹识别安全技术,也就是 Touch ID,开创了生物安全识别技术在便携设备上使用的新篇章.此后,苹果还将此技术带到了 iPad 上.此前没有任何 ...

  10. 简述RPC原理实现

      前言 架构的改变,往往是因为业务规模的扩张. 随着业务规模的扩张,为了满足业务对技术的要求,技术架构需要从单体应用架构升级到分布式服务架构,来降低公司的技术成本,更好的适应业务的发展. 分布式服务 ...