2017-09-24 5 views
-1

J'ai une étrange question ici.Des questions étranges à propos de la comparaison du résultat Integer de Spring DAO

entité 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; 
    } 
} 

Code1:

@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"); 
      } 
     } 
} 

la méthode querySupByid:

@Select("SELECT state FROM TBL_SUP WHERE ID=#{supId} ") 
Sup querySupByid(@Param("supId")Integer sup); 

partie du résultat comme suit:

  • mon état: 0
  • mon état: 0
  • [1] >>>> 0 = 0
  • mon état:! 0
  • [2] >>>> 0 = 0
  • mon état: 0
  • [3] >>>> 0 = 0

....

Le résultat attendu est que je 10 "mon état: 0!". Comme vous pouvez le constater, la plupart des résultats attendent la première boucle sont tous mauvais (state!=Integer.valueOf(0) cause de l'état est toujours 0 alors voici devrait toujours être faux), à côté j'ai changé un code comme celui-ci

Code2:

@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"); 
      } 
     } 
} 

dans chaque boucle je fais une pause de 5 secondes et le résultat est devenu ceci:

  • mon état: 0
  • mon état: 0
  • mon état: 0
  • mon état: 0
  • mon état: 0
  • mon état: 0
  • mon état: 0
  • mon état: 0
  • mon état: 0
  • mon état: 0

clairement j'ai finalement obtenu le bon résultat; Ensuite, je change à nouveau le code;

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"); 
      } 
     } 
} 

En Code3 le résultat est correct, et je changé le code encore une fois:

CODE4:

@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"); 
      } 
     } 
} 

le même résultat avec Code3, mais je ne peut pas comprendre l'explication raisonnable.Je l'ai compris, le résultat est causé par le cache, le premier résultat a été sérialisé en cache, le résultat suivant provenant du cache a été désérialisé. Donc le résultat suivant n'est pas "==" le premier résultat, quel une erreur stupide

+0

"Comme vous pouvez le voir, la plupart des résultats sont faux" - Non, je ne vois pas pourquoi ce résultat est faux et vous n'avez pas expliqué ce qui serait "bon" résultat. Vous allez chercher 10 fois la même entité et l'état est le même pour tous, 0 dans votre cas. Je ne vois pas qui serait différent des itérations. – Antoniossss

+0

Lorsque vous comparez des primitives encadrées, utilisez toujours 'equals', pas' == 'ou'! = '. Ce dernier test pour l'identité de l'objet. – Henry

+0

L'explication réside dans l'implémentation de 'sup.getState()' et 'supDao.querySupByid (40017)'. Nous devons voir cela. – Henry

Répondre

0

Ne pas comparer Integer objets avec == et !=. Ces opérateurs vérifieront si deux objets sont identiques, pas s'ils ont la même valeur, et il n'y a aucune garantie que le même objet Integer est toujours retourné par valueOf pour une valeur donnée. Utilisez toujours equals pour l'objet Integer.

0

Pour comparaison utiliser Integer.compare(int,int). Le résultat de 0 signifiera l'égalité.