细节之Integer数值(==)比较问题
来源:互联网 发布:淘宝火影忍者手游cdk 编辑:程序博客网 时间:2024/06/07 02:46
1.问题场景
先看如下一段代码
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
activity.getTotalCounts() 和activity.getParticipationCounts()的值都是Integer类型,在两者数值都一样的时候,测试发现vo.setProbableOpenTime(new Date(time)); 这段代码竟然有时候能执行到,有时候却不行。比如 都等于100时,能够执行到这段代码,都等于200时却不行了,好奇怪的问题,都是一样的数值怎么就有时候成立,有时候不成立呢!于是有了下面这段测试代码
2.Integer数值比较单元测试
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
输出结果为:
true
false
true
结果可知,Integer 用==比较数值确实有时候成立,有时候却不行。
3.问题的本质
想知道为啥有这么奇怪的结果,还是要看看源代码的,如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
Integer a = 100实际上调用了valueOf(int i)方法。
这里low是-128,high是127,从方法的注释中可以得知,在[-128,127]之间,Integer总是缓存了相应数值对象,这样每次取值时都是同一个对象,而不在此区间时,则不一定会缓存,那么取出两个同样数值大小的对象则不是同一个对象,每次都会new Integer(i);,所以其对象的地址不同,则用==比较是自然不会成立。Integer缓存的目的正如注释所言better space and time performance by caching frequently requested values.但是个人以为这样的设计又何尝不是雷区!
为了防止不小心掉入这样的陷阱,对于基本类型的比较,用“==”;而对于基本类型的封装类型和其他对象,应该调用public boolean equals(Object obj)方法(复杂对象需要自己实现equals方法)。
- 细节之Integer数值(==)比较问题
- Integer数值比较问题
- Java之Integer数值比较
- 踩坑笔记之Integer数值比较
- String 和integer的用==比较细节
- 关于Integer数值比较的问题以及不可变对象
- java中Integer数值比较
- Integer 数值范围在-128~127之间时分别使用 ==和 equals进行比较
- integer ==比较
- java Integer和int之间==的比较问题
- Integer类型用 “==” 比较的问题
- Integer和int之间==的比较问题
- 【Java】Integer变量相等(==)比较问题
- Java Integer之“==”问题
- Integer类型 == 比较
- java Integer == 比较
- Integer的 == 比较
- Integer 型比较问题
- 自动行为操控Steering(十一)—分散(群体操控)
- linux 解决笔记本不能调节屏幕亮度问题
- Spring bean xml 配置继承
- BMP图片格式
- JavaWeb实现文件上传下载功能实例解析以及项目工程示例下载
- 细节之Integer数值(==)比较问题
- CodeForces 732B Cormen — The Best Friend Of a Man
- Xcode 符号断点(Symbolic Breakpoint)
- 移动端,pc短添加好友、群功能
- PAT1016
- 各向异性扩散 Anisotropic diffusion
- Myeclipse导入Maven项目到成功运行全过程
- 二叉排序树的学习
- libsvm相关变量总结以及libsvm 参数粗调、微调技巧 和PCA主成分分析princomp函数的使用