彩票客户端“忘记密码”功能有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. 使用webpy创建一个简单的restful风格的webservice应用

    下载:wget http://webpy.org/static/web.py-0.38.tar.gz解压并进入web.py-0.38文件夹安装:easy_install web.py 这是一个如何使用 ...

  2. [lr & ps] 色彩空间管理

    色彩空间 • 定义 色彩空间,Color Space,又称作色域.在色彩学中,人们建立了许多色彩模型,以一维.二维.三维甚至四维空间坐标来表示某一色彩,这种坐标系统所能定义的色彩范围即色彩空间.我们经 ...

  3. C#调用VP 包含素材

    VS2012 +VP9.0 ***************** 自己运行的时只要修改VP里面素材的路径即可 链接: https://pan.baidu.com/s/1J6Bc5FcBYLZLgqe30 ...

  4. Look for the Air Jordan 32 in full family sizing

    Following the release of the 'Rosso Corsa' colorway, Jordan Brand is now set to officially launch th ...

  5. Bootstrap下拉单学习

    <!DOCTYPE HTML><html><head><link rel="stylesheet" href="/stylesh ...

  6. zw版【转发·台湾nvp系列Delphi例程】HALCON ZoomImageFactor2

    zw版[转发·台湾nvp系列Delphi例程]HALCON ZoomImageFactor2 procedure TForm1.Button1Click(Sender: TObject);var op ...

  7. fafu 1413

    叉积的运用 ,不断的用叉积去判断 最小的拼图, 刚开始对点进行排序,每个人的排序规则不同做法可能不同,我是按照点的x轴进行x轴相同用y小的在前面,然后每个点按照最下的点开始进行查找 每次从一个点出发然 ...

  8. Hive 常用语句(持续更新中)

    1)按包含关键字在指定库中查找表名:show tables in dw '*_fab_*';   2)查看和删除自己hdfs系统所用的空间和文件(与shell命令合用):hive命令行下: --查看仓 ...

  9. Azkaban学习笔记(一)

    1. 任务调度概述 一个完整的数据分析系统通常都是由大量任务单元组成: shell脚本程序,java程序,mapreduce程序.hive脚本等 各任务单元之间存在时间先后及前后依赖关系 现成的开源调 ...

  10. Linux基础命令---cal

    cal cal指令可以显示一个日历信息,如果没有指定选项和参数,那么就会显示当前的月份. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedora ...