发现问题
项目里有发现“神奇”的代码,先不考虑代码逻辑以及实现方法是否合理,原来代码实现大致是这样:
1 | ## department 对象 |
1 | ## user 对象 |
1 | ## 组织部门人员信息 |
坑点,看到伪码大概都能知道了,就是Integer的比较,应该使用 equals() 或者 转换成 int进行比较,但这里隐藏了Java
的一个特性,使得 == 的运行符合预期,不正常变得正常了!!!但是“正常”还得结合特定的数据,造来:
1 | CREATE TABLE `b_department` ( |
如果部门数据比较少,数据库中的department_id
刚好都小于127,程序运行的符合预期!!! Why?!!
在这里:1
2
3
4
5为了节省内存,对于下列包装对象的两个实例,当它们的基本值相同时,他们总是 ‘相等’的
Boolean
Byte
Character, \u0000 - \u007f(7f是十进制的127)
Integer, -128 — 127
延伸 :JVM通过参数调整包裹对象缓存大小
使用Oracle/Sun JDK 6,在server模式下,使用-XX:AutoBoxCacheMax=NNN参数即可将Integer的自动缓存区间设置为[-128,NNN]
注意: 区间的下界固定在-128不可配置,在client模式下该参数无效。
测试代码:
1 | public class TestIntegerCache { |
1 | shell >java TestIntegerCache |