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. Mysql:查询每个月下的数据,根据状态或者年份的sql语句

     ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本次的MySQL开篇记录了一道面试题,我给其扩展一下 这面试题它难点在什么地方,不外乎是操作月份和将其展示的 ...

  2. 多进程Multiprocessing模块

    多进程 Multiprocessing 模块 先看看下面的几个方法: star() 方法启动进程, join() 方法实现进程间的同步,等待所有进程退出. close() 用来阻止多余的进程涌入进程池 ...

  3. c# 编程语言tag

    ['JavaScript','Objective-C','C++','C#','Basic','PHP','Python','Perl', 'Transact-SQL','ruby','CSS3',' ...

  4. 19.最省钱的app发短信方法

    在创业团队中,一个重要的原则是能省就省,该花就花,把银子用在刀刃上. 现在的app,为了获取用户的社交关系,需要用户的手机号注册.用手机号注册就涉及到一个发送短信验证码的问题,那怎么才能在短信服务上投 ...

  5. Windows10 使用docker toolbox安装docker

    一.介绍 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间 ...

  6. 映射内网ftp服务器到公网报错问题解决

    这两天公司测试环境有个需求要让合作方通过ftp推送数据,一般内网环境是不会对公网开放ftp服务的,但是因为是临时需求就帮着搭了ftp服务,并且做了公网映射.ftp服务搭好之后在内网访问正常,但是在公网 ...

  7. mime.go

    package manager import (     "mime"     "path" ) //初始化数据 func init() {     if mi ...

  8. 【BZOJ 5222】[Lydsy2017省队十连测]怪题

    题目大意: 传送门 给一个长度为$n(n<=200)$的数列$h$,再给$m$个可以无限使用的操作,第$i$个操作为给长度为花费$c_i$的价值给长度为$l_i$的数列子序列+1或-1,求将数列 ...

  9. 为什么说JAVA中要慎重使用继承

    JAVA中使用到继承就会有两个无法回避的缺点: 打破了封装性,迫使开发者去了解超类的实现细节,子类和超类耦合. 超类更新后可能会导致错误. 继承打破了封装性 关于这一点,下面是一个详细的例子(来源于E ...

  10. ll 和 ls -l的详解

    ll会列出该文件下的所有文件信息,包括隐藏文件 而ls -l 只会列出显示文件 ll 命令列出的信息更加详细,有时间,是否可读写等信息 ll命令和ls -l命令结果区别: 上面结果说明: 各个字段的含 ...