今天使用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小时内与您取得联系。