iteye_8211 2010-06-22 18:47
浏览 235
已采纳

Integer变量比较的问题

前两天去面试,碰到的难题,始终不明白,谢谢你的回答:

 

public static void main(String arg[]){
        
        Integer a=11;
        Integer b=11;
        System.out.println(a==b);
        System.out.println(a.equals(b));
        a=3311;
        b=3311;
        System.out.println(a==b);
        System.out.println(a.equals(b));
        
    }

答案是true,true,false,true

 

想问的是: 为什么变量 a 在重新赋值3311后,a==b比较的结果是false呢?  !谢谢

  • 写回答

2条回答 默认 最新

  • ouchxp 2010-06-22 19:25
    关注

    楼主的代码实际上被Java编译器解析成了
    [code="java"] Integer a = Integer.valueOf(11);
    Integer b = Integer.valueOf(11);
    System.out.println(a == b);
    System.out.println(a.equals(b));
    a = Integer.valueOf(3311);
    b = Integer.valueOf(3311);
    System.out.println(a == b);
    System.out.println(a.equals(b));[/code]

    通过观察valueOf函数就可以发现

    [code="java"] public static Integer valueOf(int i) {
    final int offset = 128;
    if (i >= -128 && i <= 127) { // must cache
    return IntegerCache.cache[i + offset];
    }
    return new Integer(i);
    }[/code]

    -128 ~ 127 这个范围内的数被Java缓存的 类似一个线程池或连接池之类的结构
    如果valueOf的数在这个范围之内的话,取到的就是同一个对象.

    否则就是new Integer(i) 两个3311的赋值语句 就是创建了两个Integer对象.
    自然用 == 来比较的话 结果就是false了.
    ( == 比较是否是同一对象, equals 比较值相等)

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 求解 yolo算法问题
  • ¥15 虚拟机打包apk出现错误
  • ¥30 最小化遗憾贪心算法上界
  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 逻辑谓词和消解原理的运用
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。