彩票客户端“忘记密码”功能有bug,今天调试时,发现了原因:

功能模块中有一段:

if(userpo.getId()!=Long.valueOf(uid)){

throw new VerifyException("mobile have been binded for uid=" + uid ,

AppCode.VERIFY_MOBILE_IS_BIND);

}

问题就处在两个Long型对象的比较。

情景:

userpo.getId()返回一个Long型对象,值是10027;

Long.valueOf(uid)返回一个Long型对象,值也是10027;

但是他们 != 运算的值是 true ,在java中对象对比一般都使用 equals 方法或者compareTo方法

解决方案:

以上代码应该改成:userpo.getId().equals(Long.valueOf(uid))  返回 true

猜想:

当初代码肯定是通过测试的,那当初是为什么会通过测试?因为最初数据小。

思考:

值得注意的是,最初学java时,我印象中Integer和Long类型的对象有使用过 == 、!= 这样来比较,结果好像也对过。

其实确实有一种情况使用 == 、!= 这样来比较也对。

例如我写了一个测试类测试Integer和Long类型对象的比较:

public class Test {

public static void main(String[] args) {

Integer a = new Integer(10);

Integer b = new Integer(10);

System.out.println("a==b:" + (a==b)); //很明显false

Integer c = 129;

Integer d = 129;

System.out.println("c==d:" + (c==d)); //false

Integer e = 127;

Integer f = 127;

System.out.println("e==f:" + (e==f));//true

Long h = 128L;

Long g = 128L;

System.out.println("h==g:" + (h==g));//false

System.out.println("h.equals(g):" + h.equals(g));//true

System.out.println("h.compareTo(g):" + h.compareTo(g));// 0

Long k = 127L;

Long m = 127L;

System.out.println("k==m:" + (k==m));//true

System.out.println("k.equals(m):" + k.equals(m));//true

System.out.println("k.compareTo(m):" + k.compareTo(m));//0

}

}

执行结果:

a==b:false

c==d:false

e==f:true

h==g:false

h.equals(g):true

h.compareTo(g):0

k==m:true

k.equals(m):true

k.compareTo(m):0

原因:查看Integer源代码后发现Integer有个内部类IntegerCache,它维护了一个Integer数组cache[] ,长度为256,还有一个静态块

static {

for(int i = 0; i < cache.length; i++)

cache[i] = new Integer(i - 128);

}

很明显这个静态块已经默认认创建出了-128~127 的 Integer 数据,因此Integer在创建对象时,若值在(-128到127)范围内,则直接从缓冲区中取,若超过该范围则创建新对象,因此在-128到127范围内Integer对象值相同时,对象  ==返回true

Long对象同理。

注:内容结合了网络的一些解答。

关于Java 中Integer 和Long对象 对比的陷阱(简单却容易犯的错误)的更多相关文章

  1. 转!! Java中如何遍历Map对象的4种方法

    在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...

  2. java中基本类型封装对象所占内存的大小(转)

    这是一个程序,java中没有现成的sizeof的实现,原因主要是java中的基本数据类型的大小都是固定的,所以看上去没有必要用sizeof这个关键字. 实现的想法是这样的:java.lang.Runt ...

  3. 【转】Java中如何遍历Map对象的4种方法

    原文网址:http://blog.csdn.net/tjcyjd/article/details/11111401 在Java中如何遍历Map对象 How to Iterate Over a Map ...

  4. (转)在Java中如何遍历Map对象

    在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...

  5. 深入理解Java中的不可变对象

    深入理解Java中的不可变对象 不可变对象想必大部分朋友都不陌生,大家在平时写代码的过程中100%会使用到不可变对象,比如最常见的String对象.包装器对象等,那么到底为何Java语言要这么设计,真 ...

  6. (转载)Java中如何遍历Map对象的4种方法

    在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...

  7. java中Integer比较需要注意的问题

    java中Integer比较需要注意的问题 package com.srie.test; import java.util.HashMap; import java.util.Map; public ...

  8. 【JAVA零基础入门系列】Day11 Java中的类和对象

    今天要说的是Java中两个非常重要的概念--类和对象. 什么是类,什么又是对象呢?类是对特定集合的概括描述,比如,人,这个类,外观特征上,有名字,有年龄,能说话,能吃饭等等,这是我们作为人类的相同特征 ...

  9. java中Integer 和String 之间的转换

    java中Integer 和String 之间的转换 将数组转换成字符串:char[] array = {'a','b','c','d','e'};String str = new String(ar ...

随机推荐

  1. PHP 接收筛选项包含0的select下拉菜单的处理

    这种情况下,PHP的判断方法如下: $where = "1=1"; if ($get['status'] !== '' && $get['status'] !== ...

  2. Spark SQL入门用法与原理分析

    Spark SQL是为了让开发人员摆脱自己编写RDD等原生Spark代码而产生的,开发人员只需要写一句SQL语句或者调用API,就能生成(翻译成)对应的SparkJob代码并去执行,开发变得更简洁 注 ...

  3. [py]python内存管理

    Python深入06 Python的内存管理 堆栈内存 - 堆内存 对象一般就是开辟在堆上的结构体: 堆内存用于提供 引用数据类型存储值 对象存储的是属性名和属性值 函数存储的是函数体代码字符串 函数 ...

  4. (转)spring boot整合redis

    一篇写的更清晰的文章,包括redis序列化:http://makaidong.com/ncjava/330749_5285125.html 1.项目目录结构 2.引入所需jar包 <!-- Sp ...

  5. 摄影EV值深入研究

    1. 什么是EV值 1.1. EV值定义 EV(Exposure Value),曝光值,是反应曝光量的一个值.当感光度为ISO 100.光圈值为F1.曝光时间为1秒时,定义曝光量为0.曝光量减少一档时 ...

  6. Python: 列表,元组,字典的区别

    Python中有3种内建的数据结构:列表,元组和字典 1.列表 list是处理一组有序项目的数据结构,即可以在一个列表中存储一个序列的项目.列表中项目应该包括在方括号中,这样python就知道是在指明 ...

  7. python3.4学习笔记(六) 常用快捷键使用技巧,持续更新

    python3.4学习笔记(六) 常用快捷键使用技巧,持续更新 安装IDLE后鼠标右键点击*.py 文件,可以看到Edit with IDLE 选择这个可以直接打开编辑器.IDLE默认不能显示行号,使 ...

  8. mysql 从数据库中获取多条记录,二维展示数据

    展示要求: 客户/日期 2017-10-16 1017-10-17 2017-10-18 客户1       客户2       数据库中数据: 解决办法: 1.新建一个实体类:客户名称.客户数据(A ...

  9. 热心网友设计出更美的Windows 10开始菜单

    开始菜单应该算是Windows操作系统的标志之一,Win8时微软曾做了大刀阔斧的改革,没想到招致一片负面评价,最终紧急推出了Win8.1系统. Win10推出后,微软等于整合了磁贴和传统风格,但也做不 ...

  10. VMware前路难测,多个厂家群雄逐鹿

    以VMware为例,虚拟机巨头公布了第二财季报告所示,它第二财季收入同比增长13%,达到了21.7亿美元,而且该公司收入和每股收益均超出预期. 在人们高谈Salesforce.亚马逊等新兴云计算厂商取 ...