面试题复习-Integer和int 的坑

首先看例子:

        Integer a1 = 128;
        Integer a2 = 128;
        System.out.println(a1 == a2);    //f


        Integer a3 = 127;
        Integer a4 = 127;
        System.out.println(a3 == a4);   //t

        Integer a5 =new Integer(127);
        Integer a6 = new Integer(127);
        System.out.println(a5 == a6);   //f


        Integer a7 = new Integer(127);
        Integer a8 = 127;
        System.out.println(a7 == a8);    //f

        Integer a51 =new Integer(127);
        Integer a61 = new Integer(127);
        System.out.println(a51.intValue() == a61.intValue());    //t

结果:


image.png

原因:

1、由于 Integer 变量实际上是对一个 Integer 对象的引用,所以两个通过 new 生成的 Integer 变量永远是不相等的,因为其内存地址是不同的;
2、Integer 变量和 int 变量比较时,只要两个变量的值是相等的,则结果为 true。因为包装类 Integer 和基本数据类型 int 类型进行比较时,会自动拆包装类为 int,然后进行比较,实际上就是两个 int 型变量在进行比较;
3、非 new 生成的 Integer 变量和 new Integer() 生成的变量进行比较时,结果为 false。因为非 new 生成的 Integer 变量指向的是 Java 常量池中的对象,而 new Integer() 生成的变量指向堆中新建的对象,两者在内存中的地址不同;
4、对于两个非 new 生成的 Integer 对象进行比较时,如果两个变量的值在区间 [-128, 127] 之间,则比较结果为 true,否则为 false。Java在编译 Integer i = 100 时,会编译成 Integer i = Integer.valueOf(100)

其实就是java 包的缓存机制的问题。

new对象不涉及缓存问题。

= 赋值对象涉及的缓存并且包装类都是与int相关,如下

1.Byte 范围-128-127

2.Character 范围0-127

3.Short 范围-128-127

4.Integer 范围-128-127

5.Long 范围-128-127

缓存范围内会自动拆包装类为基本类型,就是比较的值。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容