今天使用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."":()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比较容易犯的错误总结就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持PHP中文网。

更多细数java中Long与Integer比较容易犯的错误总结相关文章请关注PHP中文网!

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

php反序列化java.long_细数java中Long与Integer比较容易犯的错误总结相关推荐

  1. 《八股文》细数Java线程、并发、锁,温故而知新

    <八股文>细数Java线程.并发.锁,温故而知新 基础 1. 并行.并发有什么区别? 2. 说说什么是进程和线程? 3. 说说线程有几种创建方式? 4. 为什么调用start()方法时会执 ...

  2. mysql数据库语句分类_细数MySQL中SQL语句的分类

    1:数据定义语言(DDL) 用于创建.修改.和删除数据库内的数据结构,如:1:创建和删除数据库(CREATE DATABASE || DROP  DATABASE):2:创建.修改.重命名.删除表(C ...

  3. 细数APDL中的流程控制命令

    作者:水哥ANSYS,获授权转载 一.概述 有过其他编程语言经验的同学都知道,流程控制类语言命令在编程中是必须掌握的一门技巧,这类命令能大幅提高我们的编程效率,增加程序可读性.类似地,在APDL中也有 ...

  4. 细数T-BOX中TI的明星产品之 线性稳压器 | 第五节TPS7B7701-Q1:为车载应用保驾护航

    汽车新热点:细数T-BOX中TI的明星产品(进行中) Interface PHY 第一节     DP83TC811S-Q1:车载以太网让您的T-BOX如虎添翼 CAN 第二节   TCAN1042- ...

  5. Java面试题15牛客 以下关于Integer与int的区别错误的是

    Java面试题15牛客 以下关于Integer与int的区别错误的是 A int是java提供的8种原始数据类型之一 B Integer是java为int提供的封装类 C int的默认值为0 D In ...

  6. java项目 配置文件_细数Java项目中用过的配置文件(properties篇)

    灵魂拷问:在不重启服务的前提下,如何让配置修改生效的呢?有什么奇技淫巧吗? 灵魂拷问:在 Java 项目中,总能看到以 .properties 为后缀的文件踪影,这类配置文件是怎么加载的呢? 项目研发 ...

  7. yaml for java_细数Java项目中用过的配置文件(YAML篇)

    灵魂拷问:YAML,在项目中用过没?它与 properties 文件啥区别? 目前 SpringBoot.SpringCloud.Docker 等各大项目.各大组件,在使用过程中几乎都能看到 YAML ...

  8. java 短路判断_细数Java最坑爹的10大功能点

    作者:践行精神自由 原文:https://www.sohu.com/a/357927861_115128 作为一门面向对象的编程语言,Java凭借其简单易用.功能强大的特点受到了广大编程爱好者的青睐, ...

  9. hikaridatasource连接池_细数springboot中的那些连接池

    hello~各位读者新年好! 回想起前几天在部署springboot项目到正线时,线上环境要求jdk7,可项目是基于jdk8开发的,springboot也是用的springboot2以上的版本,可以说 ...

最新文章

  1. python 开运算_形态学去噪python(开运算,闭运算)
  2. C# 多线程,解决处理大数据时窗体(不能拖动等)假死现象
  3. C++对C的加强之新增Bool类型关键字
  4. 我的世界java版导入地图_网易我的世界备份与导入地图
  5. 信息学奥赛之数学一本通_部分地区中考加分,又一批中学公布中考认可信息学特长生!...
  6. Fuel 5.1安装openstack I版本环境 (ESXi)
  7. python收取wss数据_大宗商品现货数据不好拿?商品季节性难跟踪?Python爬虫一键解决没烦恼...
  8. hibernate one2one 唯一外键关联(双向关联)
  9. centos7 安装VNC Server
  10. python-3高级特征
  11. linux蜂鸣器控制实验,【Linux公开课】蜂鸣器使用、LCD背光控制、触摸屏校准、GPIO操作...
  12. vue 实现 tomato timer(蕃茄钟)
  13. 印象笔记如何分享链接_【记录】试用印象笔记最新的笔记分享出页面的功能
  14. python snownlp了解_python中snownlp情感分析简易的demo分享
  15. linux表示一序列ip,linux 下查看硬件信息(mac,IP地址,硬盘型号,序列号等)
  16. 猎人抓兔子 - (广度优先算法)
  17. mybatis mysql concat_在MyBatis中使用concat()方法
  18. win10 office2021+mathtype安装配置
  19. 杜比真实环绕 还原影院视听,飞利浦杜比全景声回音壁B8967臻情上市
  20. 万能电视遥控器代码表

热门文章

  1. 程序员VS产品经理日常
  2. Python 爬取 620 首虾米歌曲,揭秘五月天为什么狂吸粉?!
  3. 悲苦手机命,“熬”在新零售
  4. 是时候让 JavaScript 面向对象了!
  5. 百度拥抱年轻人,53 岁张亚勤成退休第一人!
  6. iPhone 的黄金时代已结束!
  7. 这才是 Python 的 “72 变”玩法!
  8. Google 的 Angular 迫使我放弃了 Web 开发
  9. iPhone 居然能当公交卡刷了?!
  10. 点击文本框内容消失,移开内容自动显示(两种方法)(原创)