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。
一般情况下是=后面的转换
所有是对象来比较 要用equals
或者前面的手动转换int
你可以试试Integer i=5,j=5;System.out.println(i==j);得到的是true。
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
}
}
在查资料的过程中我了解到:
Integer类型的变量当赋值-128到127之内的值的时候,它是会去类似于字符串常量池的一个Integer的池中去取,所以Integer i=5,j=5;System.out.println(i==j);得到的是true。因为这个5是Integer的池中的5,它的引用位置相同,所以即便是比较引用地址,结果依然是true。
那这样的话,我的问题是不是可以转换成:为什么memberId和updateRecordMemberId也都是5,而不去Integer的池中去取。
但Member类型的member对象中的memberId属性是登录的时候我手动set进去的值,并不是“Integer i1 = new Integer(5);”这种形式赋值的。后来我在测试的时候临时声明了一个Integer x=5;然后让x和member.memberId比较,但得到的结果依然是false(不相等)。
而int会为什么会相等了呢,因为作为int,long,double,short等基本类型而言,他在声明的时候是在所谓的java的一个对象池中找等于你要声明的那个数,如果有就直接拿过来。所以会相等,因为指的是同一地址!
int a=5------先去对象池找值等于5的,没有,创建,然后放在对象池中 (只能存基本类型)
int b=5------先去对象池找值等于5的,有,直接拿过来用。Integer a=new Integer(5);开辟内存空间。
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方法,而不用“==”。