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. 玩转JPA(一)---异常:Repeated column in mapping for entity/should be mapped with insert="false" update="fal

    最近用JPA遇到这样一个问题:Repeated column in mapping for entity: com.ketayao.security.entity.main.User column: ...

  2. ActiveJDBC 学习笔记

    官网: http://javalite.io/getting_started

  3. xp开机黑屏故障分析

    今天装完xp系统之后,重启开机发现竟然黑屏了,查资料发现有很多用户在修改分辨率后,因显示器不支持修改后的分辨率,会出现电脑黑屏的情况.分辨率调高了,超出了屏幕的范围,肯定会黑屏,而且这个问题还挺麻烦, ...

  4. &,|,^的用法

    &,|,~,^的用法 &按位与 |按位或 ~按位非 ^按位异或 举例: int x = 5; int y = 11; System.out.println(x|y); System.o ...

  5. BZOJ_4636_蒟蒻的数列_线段树+动态开点

    BZOJ_4636_蒟蒻的数列_线段树+动态开点 Description 蒟蒻DCrusher不仅喜欢玩扑克,还喜欢研究数列 题目描述 DCrusher有一个数列,初始值均为0,他进行N次操作,每次将 ...

  6. BZOJ_3012_[Usaco2012 Dec]First!_trie树+拓扑排序

    BZOJ_3012_[Usaco2012 Dec]First!_trie树+拓扑排序 题意: 给定n个总长不超过m的互不相同的字符串,现在你可以任意指定字符之间的大小关系.问有多少个串可能成为字典序最 ...

  7. 【游戏开发】小白学Lua——从Lua查找表元素的过程看元表、元方法

    引言 在上篇博客中,我们简单地学习了一下Lua的基本语法.其实在Lua中有一个还有一个叫元表的概念,不得不着重地探讨一下.元表在实际地开发中,也是会被极大程度地所使用到.本篇博客,就让我们从Lua查找 ...

  8. MYSQL—— 启动MYSQL 57 报错“The service MYSQL57 failed the most recent........等”的问题解决方式!

    每天开机之后,启动MYSQL Notifier就报错,第一次出现重启电脑后解决,后面的几天老是出现,重启电脑好几次都没有解决,感觉很烦人,一定要搞定这个问题找到原因,于是有了下文....... 启动M ...

  9. RabbitMQ和Kafka到底怎么选(二)?

    前言 前一篇文章<RabbitMQ和Kafka到底怎么选?>,我们在吞吐量方面比较了Kafka和RabbitMQ,知道了Kafka的吞吐量要高于RabbitMQ.本文从可靠性方面继续探讨两 ...

  10. Scala 编码习惯

    1. 不用var.var是可以被不断修改的,而val是不能被修改的.使用val而不是var能让你的程序更强壮,bug更少,更好调试,更容易测试,在并发条件下,更容易调优而获得更好的性能.数学证明我们不 ...