0x01
A同學在寫考勤模塊接口時候有一段代碼片段是這樣寫的
//加班管理 列表
for(CiOverTime overTimePojo : overTimeList) {
if(overTimePojo.getPersonid() == personDeptList.get(i).getRid()) {
overTimePersonList.add(overTimePojo);
}
}
printPojo.setOverTimeList(overTimePersonList);
//請假管理 列表
for(CiApplyLeave applyLeavePojo : applyLeaveList) {
if(applyLeavePojo.getPersonid() == personDeptList.get(i).getRid()) {
applyLeavePersonList.add(applyLeavePojo);
}
}
printPojo.setApplyLeaveList(applyLeavePersonList);
//遲到早退 列表
for(CiWorkLate workLatePojo : workLateList) {
if(workLatePojo.getPersonid() == personDeptList.get(i).getRid()) {
workLatePersonList.add(workLatePojo);
}
}
printPojo.setWorkLateList(workLatePersonList);
//曠工管理 列表
for(CiAbsent absentPojo : absentList) {
if(absentPojo.getPersonid() == personDeptList.get(i).getRid()) {
absentPersonList.add(absentPojo);
}
}
測試部在黑盒測試該接口具體功能時寥裂,發(fā)現(xiàn)數(shù)據(jù)不全嵌洼,只能顯示一部分數(shù)據(jù)。 由于A同學已經跑路封恰。 我就去調試下他的代碼麻养。發(fā)現(xiàn)
if(overTimePojo.getPersonid() == personDeptList.get(i).getRid()) 中 ==號前后 Long類型的值。
所以問題找到了 把== 改為 eq就行了诺舔。
0x02
問題結束了么鳖昌?
還記得測試部說 部分數(shù)據(jù)可以顯示么。低飒。许昨。。
那也就是說 Long類型對像 在==的作用下是可以出現(xiàn) true的褥赊。车要。。
看代碼
public static void main(String[] args) {
Long testa = 125l;
Long testb = 125l;
Long testc = 1280l;
Long testd = 1280l;
System.out.println(testa==testb);
System.out.println(testc==testd);
}
運行的結果為:
true
false
哦崭倘。這樣翼岁,A同學挖了出了個大坑啊。司光。琅坡。
0x03
答案在valueOf方法中
以Long為例
首先下面的這兩種寫法作用是一樣的,也就是Long的自動裝箱
Long testa = Long.valueOf(125);
Long testa = 125l;
JDK源碼(答案在這里
)
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);
}
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);
}
}