我们项目中要用到分页,由于项目组是新组建的,没又任何现成的代码可用,编程人员也都经验不足,又比较赶进度,所以没有建立一个稳定健壮高效复用性高的分页算法,而是把分页代码写在了每个jsp页面上,说到分页,自然要用到页码什么的,听闻java5的基本类型的包装类是支持自动封装和自动解封的,而我们的编码人员也想试试看这自动封装和自动解封到底有多奇妙,于是涉及到页码的变量全使用了Integer类型,于是就有了下面的代码: Integer currentPage = 0;
 currentPage = Integer.parseInt(pageString);// 当前页码
 if (currentPage == 0)
 {
  currentPage = 1;
 }
 
 Integer totalCount = content.size(); // 记录的总数
 Integer totalPageCount = ((totalCount + pageSize) - 1) / pageSize;// 页面的总数 Integer upPage = currentPage - 1;
 if (upPage <= 1)
 {
  upPage = 1;
 } Integer nextPage = currentPage + 1;
 if (nextPage >= totalPageCount)
 {
  nextPage = totalPageCount;
 } else
 {
  nextPage = currentPage + 1;
 }
 
 if(totalPageCount != 0) {
  if(totalPageCount == 1){
   subContent = content.subList(0, totalCount);
  } else if(currentPage==totalPageCount) {  
   subContent = content.subList(((totalPageCount - 1)*10), totalCount);
  } else {
   subContent = content.subList(((currentPage-1) * 10),(currentPage * 10));
  } 
 } else {
  subContent = new ArrayList();
 }         如果相信java5的自动解封是完美的话,那么这段代码是没有问题的,而且我们用这段代码跑了几个月,居然运行良好,于是乎觉得java5的基本类型包装类太完美。可是最近系统更新增加了几个新的报表,其中一个报表在测试分页的时候出现了异常,异常情况是这样的,当页数不多的时候所有分页都是正常的,但是当页数比较多的时候,比如160页,这时候点其他页也是正常的,但是点最后一页的时候就出现异常了,于是把代码拿出来仔细看了一下发现当最后一页的时候理应执行的这段代码没有被执行else if(currentPage==totalPageCount) {  
   subContent = content.subList(((totalPageCount - 1)*10), totalCount);
  }         马上明白过来是怎么回事了,当两个都是整形包装类的时候,用==号它实际上是做了两个引用是否是同一对象的判断,而不是我们希望的两个对象的值是否相等,问题就出在这了,你要判断是同一对象就一直判断是同一对象啊,干么一下判断是否是同一对象,一下又判断是否是值相等呢,你这不是误导人吗,想不明白,盼有高手指点迷津
        
         哎,java啊java,想说恨你难,可有时候想说爱你也不容易啊

解决方案 »

  1.   

    ==对于引用类型来说就是判断是否引用同一个对象,不过java对封装类型做了点优化.
    -128~+127之间的int值,byte值,long值,short值他们对应的封装类的对象都直接缓存了.Character缓存0-127.
    所以
    Integer i=1;
    Integer ii=1;
    i和ii会引用同一个对象.

    Integer i=128;
    Integer ii=128;
    则i和ii都指向新创建的对象.
    可以参考Integer这些类的源代码,看valueOf()方法的实现,因为装箱时用到了这个方法.
      

  2.   

    果然是这样谢谢解惑了这样的话我想了解一下当执行<,<=这样的运算的时候又是怎样一种情况应该怎么做呢
      

  3.   

    这种有运算的建议不要封装类一般只用于pojo字段比较方便我一直都是看作对象的,比较用equals
      

  4.   

    2个 Integer进行 == 当然比较的是地址而不是value了。你自己想想吧。 既然你是Integer,为何不用equals呢?真的如你所说,不要太依赖了。规矩一点没坏处!
      

  5.   

    <,<=,>=,>的时候会自动的拆箱.
      

  6.   

    http://blog.csdn.net/ZangXT/archive/2008/11/19/3334030.aspx
      

  7.   

    用 == 进行大小比较,得用 int 哦;使用 Integer 的话,得用 equals 进行比较,这并不是自动拆箱的问题。