全网整合营销服务商

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

免费咨询热线: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比较相同的四种方式举例  # 它是  # 都是  # 给大家  # 的是  # 反编译  # 他们的  # 就会  # 就能  # 就不  # 希望能  # 来看看  # 写了  # 都将  # 可以看出  # 这篇  # 可以得到  # 方法来  # 再做  # 再看看  # 都应 


相关文章: 哈尔滨网站建设策划,哈尔滨电工证查询网站?  建站之星体验版:智能建站系统+响应式设计,多端适配快速建站  如何实现建站之星域名转发设置?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  如何在阿里云购买域名并搭建网站?  三星网站视频制作教程下载,三星w23网页如何全屏?  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  临沂网站制作企业,临沂第三中学官方网站?  制作旅游网站html,怎样注册旅游网站?  高防服务器:AI智能防御DDoS攻击与数据安全保障  Android自定义控件实现温度旋转按钮效果  如何通过西部数码建站助手快速创建专业网站?  如何在阿里云ECS服务器部署织梦CMS网站?  一键网站制作软件,义乌购一件代发流程?  教学网站制作软件,学习*后期制作的网站有哪些?  如何通过商城免费建站系统源码自定义网站主题?  黑客如何利用漏洞与弱口令入侵网站服务器?  如何登录建站主机?访问步骤全解析  建站之星Pro快速搭建教程:模板选择与功能配置指南  建站之星如何助力企业快速打造五合一网站?  宝塔建站无法访问?如何排查配置与端口问题?  制作证书网站有哪些,全国城建培训中心证书查询官网?  制作网站的过程怎么写,用凡科建站如何制作自己的网站?  上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?  制作网站的软件免费下载,免费制作app哪个平台好?  建站之星代理如何获取技术支持?  建站与域名管理如何高效结合?  建站之星如何开启自定义404页面避免用户流失?  公司门户网站制作流程,华为官网怎么做?  教程网站设计制作软件,怎么创建自己的一个网站?  如何快速登录WAP自助建站平台?  c# await 一个已经完成的Task会发生什么  制作表格网站有哪些,线上表格怎么弄?  家庭建站与云服务器建站,如何选择更优?  如何在IIS中新建站点并配置端口与IP地址?  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  建站主机选购指南与交易推荐:核心配置解析  购物网站制作公司有哪些,哪个购物网站比较好?  沈阳制作网站公司排名,沈阳装饰协会官方网站?  网站制作模板下载什么软件,ppt模板免费下载网站?  南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?  常州企业网站制作公司,全国继续教育网怎么登录?  建站主机服务器选型指南与性能优化方案解析  如何高效配置IIS服务器搭建网站?  如何彻底卸载建站之星软件?  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  ,网页ppt怎么弄成自己的ppt?  如何自定义建站之星网站的导航菜单样式?  如何用好域名打造高点击率的自主建站?  ,南京靠谱的征婚网站? 

您的项目需求

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