JAVA中Long与Integer比较容易犯的错误(比较数据equals)
来源:互联网 发布:java面试基础知识总结 编辑:程序博客网 时间:2024/05/17 09:37
今天使用findbugs扫描项目后发现很多高危漏洞,其中非常常见的一个是比较两个Long或Integer时直接使用的==来比较。 其实这样是错误的。
因为Long与Ineger都是包装类型,是对象。 而不是普通类型long与int , 所以它们在比较时必须都应该用equals,或者先使用longValue()或intValue()方法来得到他们的基本类型的值然后使用==比较也是可以的。
但是有一种特殊情况, 其实Long与Integer都将 -128~127 这些对象缓存了。 可以看看Long类型源码里面有一个LongCache类,代码如下:
先看看这个例子:打印的结果是:
原因
首先来看看 Long a = 5L ; 它是如何将一个基本类型long包装成一个对象Long的 。
可以写一个测试类,然后反编译一下,看看java它是如何解析Long a = 5L这样一条命令的 。
测试类如下:
然后使用javap -verbose Test06 就能看到反编译的结果了, 下面是输出的部分:从Code中的8可以看出调用了Long的一个类方法Long.valueOf(Long) , 所以可以得到的结论是Long a = 5L实际上等于 Long a = Long.valueOf(5) ;然后再看看Long.valueOf()方法是如何定义的:
一目了然,会先判断基本类型的值如果在-128~127之间,就会直接从LongCache里面取出缓存的对象返回,否则就new一个新的Long对象返回 。现在就不难理解Test05程序执行得到的结果了,因为a与b等于5,在-127~128之内,所以都是直接从LongCache里面返回的一个Long对象,所以他们在使用==比较的时候,就是相等的(对于对象类型来说,==比较的是两个对象的引用指向堆中的地址) ,而c与d等于129,不在-127~128之间,所以他们他们是分别new出来的两个新的Long对象,使用==来比较自然是不相等的了。
Long重写了equals方法:
它是先通过.longValue()方法获取Long对象的基本类型long的值之后再做比较的。所以对于Integer与Long的比较,最好是使用equals来比较才能确保得到我们想要的结果。
Integer与Long一样,这里就不举例了。
阅读全文
0 0
- JAVA中Long与Integer比较容易犯的错误(比较数据equals)
- JAVA中Long与Integer比较容易犯的错误
- JAVA中Long与Integer比较容易犯的错误
- JAVA中Long与Integer比较容易犯的错误
- JAVA中Long与Integer比较容易犯的错误
- JAVA中Long与Integer比较容易犯的错误
- JAVA中Long与Integer比较容易犯的错误
- JAVA中Long与Integer比较容易犯的错误
- JAVA中Long与Integer比较容易犯的错误
- 1.00 【基础知识之基础类型】 JAVA中Long与Integer比较容易犯的错误
- JAVA中Long与Integer 比较的误区
- 初学者比较容易犯的布局错误(手风琴布局)
- long Long数据比较的错误
- java中Integer的比较
- Java中Integer/Long/Double/Float大小比较
- 数据挖掘中最容易犯的十大错误
- Java之Integer与int类型数据的比较-yellowcong
- Java中的Integer、Long等实例的比较
- 线性渐变
- 调试
- ggplot2-分面(facet) 一页多图(转载)
- 将jar打入本地仓库
- Python2.7 hmac.py TypeError: character mapping must return integer, None or unicode"
- JAVA中Long与Integer比较容易犯的错误(比较数据equals)
- 订飞机票的代码
- tp5分页id自增
- u-boot中的usb命令
- 实验0.2
- 统一编址和独立编址
- 上升沿检测代码实现
- Java中的ReentrantLock和synchronized两种锁定机制的对比
- 对于随机森林的通俗理解