this.updateRecords=updateRecordService.listUpdateRecords(this.timeStamp);  
      HttpSession session=this.getSession(false);  
      if(session==null||session.getAttribute("userInfo")==null)  
      {  
          this.addFieldError("member.memberName", "会话已过期,请重新登录");  
          return LOGIN;  
      }  
      Member member=(Member) session.getAttribute("userInfo");  
      Integer memberId=member.getMemberId();  
      System.out.println(memberId==5);  
              
      for(UpdateRecord updateRecord:this.updateRecords)  
      {  
           //此条更新记录中用户角色为会员且不等于当前请求数据同步的会员时,跳过此条更新记录  
           Integer updateRecordMemberId=updateRecord.getMemberId();  
断点处     if(updateRecord.getRole()==2&&memberId!=updateRecordMemberId)  
           {  
                 System.out.println(updateRecord.getMemberId()==5);  
                 continue;  
            }  
                  …… 后续代码…… 
      }  我debug到断点处发现memberId与updateRecordMemberId的值都为5,且eclipse显示if的逻辑表达式为false,但居然还是能走进if的语句块内,我勒个去,我就晕了。5在-128到127的范围内呀,这到底咋回事。 
补充:member中的memberId和updateRecord中的memberId都是Integer类型的,Dao层使用的ibatis。

解决方案 »

  1.   

    如果把Integer都换成int就不会有问题了
      

  2.   

    以为你也搞不懂是Integer拆箱还是int去装箱
    一般情况下是=后面的转换
    所有是对象来比较 要用equals
    或者前面的手动转换int
      

  3.   


    你可以试试Integer i=5,j=5;System.out.println(i==j);得到的是true。
      

  4.   

    给Lz一段小代码,如果LZ能想明白就能知道自己的问题了class Test {
        public static void main(String[] args) {
            Integer i1 = new Integer(5);
            Integer i2 = new Integer(5);
            System.out.println(i1 == i2); //false (你的recode应该是发生了这样的情况,即new的id,而不是=的id赋值)
            
            Integer i3 = 5;
            Integer i4 = 5;
            System.out.println(i3 == i4); //true
        }
    }
      

  5.   

    其实我对这个问题并不是没花时间,我也查资料,写代码测试等等。
    在查资料的过程中我了解到:
    Integer类型的变量当赋值-128到127之内的值的时候,它是会去类似于字符串常量池的一个Integer的池中去取,所以Integer i=5,j=5;System.out.println(i==j);得到的是true。因为这个5是Integer的池中的5,它的引用位置相同,所以即便是比较引用地址,结果依然是true。
    那这样的话,我的问题是不是可以转换成:为什么memberId和updateRecordMemberId也都是5,而不去Integer的池中去取。
      

  6.   

    UpdateRecord类型的updateRecord对象 是ibatis查询返回的对象,我不知道它如何为memberId属性填充的值;
    但Member类型的member对象中的memberId属性是登录的时候我手动set进去的值,并不是“Integer i1 = new Integer(5);”这种形式赋值的。后来我在测试的时候临时声明了一个Integer x=5;然后让x和member.memberId比较,但得到的结果依然是false(不相等)。
      

  7.   

    equals 与 = 的区别啊
      

  8.   

    登录时手动set进去:5,测试时声明了一个Integer x=5,这两个“5”并不相等,是因为登录时的5,传到程序时已变了,就象你快递一张发票,收到时不会只是一张发票,它会有包装……,收到“5”时,它已被处理过,已不是单纯的Integer 5 。
      

  9.   

    记得以前将收到的密码进行比较,老是不相等,任凭你怎么变换,后来看到例子是要去空格的,自己加上trim才了事,密码输入时是无空格的。
      

  10.   

    与大家讨论就是能理一下思路的。登陆时不是我手动set的5,而是通过用户名查询出来的member对象,也就是说也是通过ibatis框架从数据库中取出来的,那么问题范围进一步缩小了。ibatis对查询结果往member对象中的对应属性memberId赋值的时候是通过何种方式赋值的。难道是“Integer i1 = new Integer(5)”这种形式?继续求解。。
      

  11.   

    原理很简单!使用Integer时,是对象,在内存会开辟空间。两个Integer,在内存中会有两个不同的内存空间!当然不会等!如果你想他们等可以重写hashcode和equals方法!
    而int会为什么会相等了呢,因为作为int,long,double,short等基本类型而言,他在声明的时候是在所谓的java的一个对象池中找等于你要声明的那个数,如果有就直接拿过来。所以会相等,因为指的是同一地址!
    int a=5------先去对象池找值等于5的,没有,创建,然后放在对象池中 (只能存基本类型)
    int b=5------先去对象池找值等于5的,有,直接拿过来用。Integer a=new Integer(5);开辟内存空间。
      

  12.   

    上面回复里我有说呀,而且你说的好像也不太对吧,基本类型不论从不从池里拿,反正比较的都是对象,没有太大意义,说从池里拿主要是对Integer类型的对象来说的,可以类比String类型对象的。
      

  13.   

     .intValue()  也是可以解决这个问题的
      

  14.   

    以前也没深究这问题,看了大家的讨论,再查了查,发觉涉及很多知识、细节。
    public class Test1
    {
      public static void main(String args[])
        {
            int a=5;
    Integer a1=5,a2=5;
    Integer a3=new Integer(5);
    System.out.printf("a %s %s\n",a==a1,a==a3);
    System.out.printf("a1 %s %s\n",a1==a2,a1==a3);

    Integer a4=500,a5=500;
    System.out.println(a4==a5);
    System.out.println(a4.equals(a5));
         }
    }
      a1,a2,a3都是对象,a1与a2相等,a1与a3不等,可见虽同是Integer的实例,等不等还与赋值是“=”,还是“new Integer”有关。(两“new Integer”创建的值不等,前面有例子,这里不再啰嗦)
      “=”赋值原是等的,a4、a5为500就不等了!原来这涉及到JAVA装箱和拆箱问题。装箱过程中调用的是valueOf方法,而valueOf方法对值在-128到127之间的数值缓存,所以a1和a2的引用是相同的,而a4和a5的引用是不一样的,而“==”比较的是引用。体会与总结:对象的比较,尽量用equals方法,而不用“==”。