全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

细数java中Long与Integer比较容易犯的错误总结

今天使用findbugs扫描项目后发现很多高危漏洞,其中非常常见的一个是比较两个Long或Integer时直接使用的==来比较。 其实这样是错误的。

因为Long与Ineger都是包装类型,是对象。 而不是普通类型long与int , 所以它们在比较时必须都应该用equals,或者先使用longValue()或intValue()方法来得到他们的基本类型的值然后使用==比较也是可以的。

但是有一种特殊情况, 其实Long与Integer都将 -128~127 这些对象缓存了。 可以看看Long类型源码里面有一个LongCache类,代码如下:

private static class LongCache {
 private LongCache(){}

 static final Long cache[] = new Long[-(-128) + 127 + 1];

 static {
   for(int i = 0; i < cache.length; i++)
 cache[i] = new Long(i - 128);
 }
  }

先看看这个例子:

public class Test05 {

  public static void main(String[] args) {
    Long a = 5L;
    Long b = 5L;

    System.out.println("a == b ? " + (a == b));

    Long c = 129L;
    Long d = 129L;
    System.out.println("c == d ? " + (c == d));
  }
}

打印的结果是:

a == b ? true
c == d ? false


原因

首先来看看 Long a = 5L ; 它是如何将一个基本类型long包装成一个对象Long的 。

可以写一个测试类,然后反编译一下,看看java它是如何解析Long a = 5L这样一条命令的 。

测试类如下:

public class Test06 {
  Long l = 3L;
}

然后使用javap -verbose Test06 就能看到反编译的结果了, 下面是输出的部分:

{
java.lang.Long l;

public com.spring.test.Test06();
 Code:
  Stack=3, Locals=1, Args_size=1
  0:  aload_0
  1:  invokespecial  #10; //Method java/lang/Object."<init>":()V
  4:  aload_0
  5:  ldc2_w #12; //long 3l
  8:  invokestatic  #14; //Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
  11: putfield    #20; //Field l:Ljava/lang/Long;
  14: return
 LineNumberTable:
  line 3: 0
  line 5: 4
  line 3: 14

 LocalVariableTable:
  Start Length Slot Name  Signature
  0   15   0  this    Lcom/spring/test/Test06;


}

从Code中的8可以看出调用了Long的一个类方法Long.valueOf(Long) , 所以可以得到的结论是Long a = 5L实际上等于 Long a = Long.valueOf(5) ;

然后再看看Long.valueOf()方法是如何定义的:

 public static Long valueOf(long l) {
 final int offset = 128;
 if (l >= -128 && l <= 127) { // will cache
   return LongCache.cache[(int)l + offset];
 }
    return new Long(l);
  }

一目了然,会先判断基本类型的值如果在-128~127之间,就会直接从LongCache里面取出缓存的对象返回,否则就new一个新的Long对象返回 。

现在就不难理解Test05程序执行得到的结果了,因为a与b等于5,在-127~128之内,所以都是直接从LongCache里面返回的一个Long对象,所以他们在使用==比较的时候,就是相等的(对于对象类型来说,==比较的是两个对象的引用指向堆中的地址) ,而c与d等于129,不在-127~128之间,所以他们他们是分别new出来的两个新的Long对象,使用==来比较自然是不相等的了。

Long重写了equals方法:

public boolean equals(Object obj) {
 if (obj instanceof Long) {
   return value == ((Long)obj).longValue();
 }
 return false;
  }

它是先通过.longValue()方法获取Long对象的基本类型long的值之后再做比较的。

所以对于Integer与Long的比较,最好是使用equals来比较才能确保得到我们想要的结果。

Integer与Long一样,这里就不举例了。

以上这篇细数java中Long与Integer比较容易犯的错误总结就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


# java  # long  # integer  # Java中Integer两种转int方法比较  # Java Integer对象的比较方式  # Java中2个Integer比较相同的四种方式举例  # 它是  # 都是  # 给大家  # 的是  # 反编译  # 他们的  # 就会  # 就能  # 就不  # 希望能  # 来看看  # 写了  # 都将  # 可以看出  # 这篇  # 可以得到  # 方法来  # 再做  # 再看看  # 都应 


相关文章: 如何在IIS中新建站点并配置端口与IP地址?  如何快速搭建支持数据库操作的智能建站平台?  *服务器网站为何频现安全漏洞?  建站之星如何配置系统实现高效建站?  网站制作的步骤包括,正确网址格式怎么写?  如何在阿里云购买域名并搭建网站?  建站之星代理费用多少?最新价格详情介绍  建站VPS推荐:2025年高性能服务器配置指南  制作网站的软件免费下载,免费制作app哪个平台好?  企业微网站怎么做,公司网站和公众号有什么区别?  如何通过可视化优化提升建站效果?  建站之星如何保障用户数据免受黑客入侵?  建站之星后台管理如何实现高效配置?  网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?  制作销售网站教学视频,销售网站有哪些?  高防服务器如何保障网站安全无虞?  如何在橙子建站中快速调整背景颜色?  专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何通过VPS搭建网站快速盈利?  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  建站之星如何一键生成手机站?  大学网站设计制作软件有哪些,如何将网站制作成自己app?  个人网站制作流程图片大全,个人网站如何注销?  广州美橙建站如何快速搭建多端合一网站?  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  专业商城网站制作公司有哪些,pi商城官网是哪个?  如何批量查询域名的建站时间记录?  如何通过万网虚拟主机快速搭建网站?  如何彻底删除建站之星生成的Banner?  全景视频制作网站有哪些,全景图怎么做成网页?  桂林网站制作公司有哪些,桂林马拉松怎么报名?  开封网站制作公司,网络用语开封是什么意思?  魔毅自助建站系统:模板定制与SEO优化一键生成指南  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  宝塔建站无法访问?如何排查配置与端口问题?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  表情包在线制作网站免费,表情包怎么弄?  浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?  ,巨量百应是干嘛的?  建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略  南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?  网站专业制作公司有哪些,做一个公司网站要多少钱?  如何在自有机房高效搭建专业网站?  c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】  如何在腾讯云免费申请建站?  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  电脑免费海报制作网站推荐,招聘海报哪个网站多?  如何快速搭建高效服务器建站系统?  定制建站模板如何实现SEO优化与智能系统配置?18字教程  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。