关于比较Spring DAO的Integer结果的奇怪问题

时间:2017-09-24 08:26:21

标签: java spring integer equals dao

我在这里有一个奇怪的问题。

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
  • 我的州:0
  • [1]&GT;&GT;&GT;&GT;!= 0
  • 我的州:0
  • [2]&GT;&GT;&GT;&GT;!= 0
  • 我的州:0
  • [3]&GT;&GT;&GT;&GT;!= 0

...

我预期的结果是“我的状态: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秒,结果变为:

  • 我的州:0
  • 我的州:0
  • 我的州:0
  • 我的州:0
  • 我的州:0
  • 我的州:0
  • 我的州:0
  • 我的州:0
  • 我的州:0
  • 我的州:0
显然我终于得到了正确的结果; 接下来我再次更改代码;

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的结果相同,但我无法弄清楚合理的解释。

我已经想通了,结果是由缓存引起的;第一个结果已被序列化为缓存,以下结果从缓存中得到反序列化。所以后面的结果不是“==”前者的结果,是什么一个愚蠢的错误

2 个答案:

答案 0 :(得分:0)

请勿将Integer个对象与==!=进行比较。这些运算符将检查两个对象是否相同,而不是它们具有相同的值,并且不能保证Integer对于给定值始终返回相同的valueOf对象。始终对equals对象使用Integer

答案 1 :(得分:0)

用于比较Integer.compare(int,int)0的结果将意味着平等。