我在这里有一个奇怪的问题。
Sup实体:
public class Sup implements Serializable {
private static final long serialVersionUID = 5898846627874143178L;
private Integer state;
public Integer getState() {
return state;
}
public void setState(Integer state) {
this.state = state;
}
}
代码1:
@Override
public void test() {
for (int i = 0; i < 10; i++) {
//Just a simple query sql,the result is always the same
//and the state of 'sup' is always 0;
Sup sup = supDao.querySupByid(40017);
Integer state = sup.getState();
System.out.println("my state:" + state);
if (state!=Integer.valueOf(0)) {
System.out.println(" ["+ i + "]>>>>0!=0");
}
}
}
querySupByid方法:
@Select("SELECT state FROM TBL_SUP WHERE ID=#{supId} ")
Sup querySupByid(@Param("supId")Integer sup);
结果的一部分如下:
...
我预期的结果是“我的状态:0”中的10。
正如您所看到的,大多数结果都预期第一个循环都是错误的(state!=Integer.valueOf(0)
导致状态始终为0所以这里应该始终为false),接下来我更改了一些这样的代码
代码2:
@Override
public void test() throws InterruptedException {
for (int i = 0; i < 10; i++) {
Sup sup = supDao.querySupByid(40017);
Integer state = sup.getState();
System.out.println("my state:" + state);
TimeUnit.SECONDS.sleep(5);
if (state!=Integer.valueOf(0)) {
System.out.println(" ["+ i + "]>>>>0!=0");
}
}
}
在每个循环中我暂停5秒,结果变为:
CODE3:
@Override
public void test() throws InterruptedException {
for (int i = 0; i < 10; i++) {
Sup sup = new Sup();//supDao.querySupByid(40017);
sup.setState(0);
Integer state = sup.getState();
System.out.println("my state:" + state);
if (state!=Integer.valueOf(0)) {
System.out.println(" ["+ i + "]>>>>0!=0");
}
}
}
在Code3中,结果也是正确的,我再次更改了代码:
码4:
@Override
public void test() throws InterruptedException {
for (int i = 0; i < 10; i++) {
Sup sup =supDao.querySupByid(40017);
Integer state = sup.getState();
System.out.println("my state:" + state);
if (!state.equals(Integer.valueOf(0))) {
System.out.println(" ["+ i + "]>>>>0!=0");
}
}
}
与Code3的结果相同,但我无法弄清楚合理的解释。
我已经想通了,结果是由缓存引起的;第一个结果已被序列化为缓存,以下结果从缓存中得到反序列化。所以后面的结果不是“==”前者的结果,是什么一个愚蠢的错误
答案 0 :(得分:0)
请勿将Integer
个对象与==
和!=
进行比较。这些运算符将检查两个对象是否相同,而不是它们具有相同的值,并且不能保证Integer
对于给定值始终返回相同的valueOf
对象。始终对equals
对象使用Integer
。
答案 1 :(得分:0)
用于比较Integer.compare(int,int)
。 0
的结果将意味着平等。