integer long java_关于Java 中Integer 和Long对象 对比的陷阱(简单却容易犯的错误)...

彩票客户端“忘记密码”功能有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对象同理。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java代码遇到"java.lang.Long cannot be cast to java.lang.Integer"的异常,通常是由于将Long类型对象强制转换为Integer类型时出现了错误。要解决这个问题,可以使用以下方法: 1. 使用适当的类型转换:确保在将Long类型对象转换为Integer类型之前,先检查其值是否适合Integer类型的范围。可以使用Long的intValue()方法将Long对象转换为int类型,然后再将int类型转换为Integer类型。 ```java Long longValue = 123456789L; if (longValue >= Integer.MIN_VALUE && longValue <= Integer.MAX_VALUE) { Integer integerValue = Integer.valueOf(longValue.intValue()); // 使用integerValue进行后续操作 } else { // 处理超出Integer范围的情况 } ``` 2. 使用包装类的valueOf方法:可以使用Integer类的valueOf方法将Long类型对象转换为Integer类型。这种方法会自动处理超出Integer范围的情况,如果超出范围,则会返回一个新的Integer对象。 ```java Long longValue = 123456789L; Integer integerValue = Integer.valueOf(longValue.intValue()); // 使用integerValue进行后续操作 ``` 3. 使用字符串转换:将Long类型对象转换为字符串,然再将字符串转换为Integer类型。这种方法可以处理任意长度的数字,但需要注意处理可能出现的NumberFormatException异常。 ```java Long longValue = 123456789L; String stringValue = longValue.toString(); try { Integer integerValue = Integer.valueOf(stringValue); // 使用integerValue进行后续操作 } catch (NumberFormatException e) { // 处理转换异常 ``

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值