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. Oracle-06:DML语言数据表的操作

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 开篇放上一个SQL脚本,供测试使用 create table DEPT ( deptno ) not null ...

  2. Navicat PatchNavicat

    Navicat for MySQL 11.0.10 32+64位(内含破解补丁)\64位 安装完成后,退出Navicat 执行PatchNavicat.exe,提示patch完成后,Navicat即可 ...

  3. Idea的一些调试技巧

    程序员的工作内容,除了大部分时间写代码之外,因为有不少的时间是用在调试代码上.甚至说不是在调试代码,就是即将调试代码. :) 今天我们来谈谈调试代码的一些技巧,在使用IDE提供的debugger时一些 ...

  4. 你不知道的JavaScript--Item1 严格模式

    本文转自[阮一峰博客]:http://www.ruanyifeng.com/blog/2013/01/javascript_strict_mode.html 一.概述 除了正常运行模式,ECMAscr ...

  5. java基础之抽象类与接口的形式参数和返回值

    抽象类与接口形式参数和返回值问题 1.形参问题 /* 1.形式参数: 基本类型(太简单,不是我今天要讲解的) 引用类型 (1)类名:(匿名对象的时候其实我们已经讲过了) 需要的是该类的对象 (2)抽象 ...

  6. 解决vi上下左右变ABCD问题

      第一步执行sudo apt-get install vim,如果没有出现错误,再次进入vi 尝试一下,看看有没有修改过来,如果出现以下错误E: Package 'vim' has no insta ...

  7. counter.go

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

  8. 在当前图纸中创建一个表格, AcDbTable 类

    Table 例子学习笔记在这个例子中,ARX向我们展示了ACDBTABLE类的一些基本操作方法,ACDBTABLE类是ACAD2005及其以后的产品,应该是说ACDBDATATABLE的升级产品,Ac ...

  9. 【UOJ】67 新年的毒瘤 &【BZOJ】1123 BLO

    [UOJ 67] 题目链接: 传送门 题解: 第一眼很懵逼……这什么鬼. 思考什么点复合条件……(o(>﹏<)o 1.树,也就是说还剩n-2条边,等价于要删去一个度数为m-n+2的点. 2 ...

  10. Java基础系列--基础排序算法

    原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9082138.html 一.概述 基础排序算法包括:桶排序.冒泡排序.选择排序.插入排序等 ...