你知道在Java中Integer和int的这些区别吗?

 更新时间:2021年06月10日 17:20:17   作者:程序届的伪精英  
最近面试,突然被问道,说一下Integer和int的区别.额…可能平时就知道写一些业务代码,包括面试的一些Spring源码等,对于这种特别基础的反而忽略了,导致面试的时候突然被问到反而不知道怎么回答了.哎,还是乖乖再看看底层基础,顺带记录一下把 ,需要的朋友可以参考下

一、基本概念(重要)

  • Integer 是 int 的包装类,int 则是 java 的一种基本数据类型;
  • Integer 变量必须实例化后才能使用,而int变量不需要;
  • Integer 实际是对象的引用,当new一个 Integer时,实际上是生成一个指针指向此对象;而 int 则是直接存储数据值;
  • Integer的默认值是null,int的默认值是0。

二、拓展

基于以上的一些概念,这里我们拓展一下,对于Integer包装类型与int基本数据类型之间数值相互比较的结果进行一下说明,这个也可能在面试当中会被问到。

三、new Integer()与new Integer()的比较

下面的代码大家觉得结果是什么呢?大家可以先自己想一想然后再继续往下看。

public static boolean comp(){
        Integer i1=new Integer(10);
        Integer i2=new Integer(10);
        return i1==i2;
    }

Integer 变量必须实例化后才能使用,也就是我们必须new Integer()之后才可以使用,而我们知道,任何对象只要是new出来的都会放在堆内存中,同时该变量存储指向堆内存的地址,只要new出来的对象就是一个新对象,也就是说i1和i2指向的两个不同的对象,为了证明这一点,我们通过javap -v 看一下字节码,也能看的很清楚。

在这里插入图片描述

因为是两个不同的对象,所以上面的结果是false。

在这里插入图片描述

四、Integer与new Integer()的比较

再看下面的代码,Integer变量 和 new Integer() 变量比较

public static boolean comp1(){
        Integer i1=new Integer(10);
        Integer i2=10;
        return i1==i2;
    }

因为 Integer变量 指向的是 java 常量池中的对象,而 new Integer() 的变量指向堆中新建的对象,两者在内存中的地址不同,两者比较的话永远为 false。

五、Integer与Integer的比较

public static void comp2(){
        Integer i = 100;
        Integer j = 100;
        System.out.print(i == j);

        Integer m = 128;
        Integer n = 128;
        System.out.print(m == n);
    }

这里为什么会列举两个呢?大家往下看。
其实Integer i = 100 在编译时,会翻译成为 Integer i = Integer.valueOf(100),而 java 对 Integer类型的 valueOf 的定义如下:

在这里插入图片描述

这里的low和high分别为-128和127。

在这里插入图片描述

阅读源码我们可以很清晰的看到,java对于-128到127之间的数,会进行缓存,所以 当Integer i 的值在 -128到127之间时,会将值进行缓存,下次再取Integer j(值在 -128到127之间)时,就会直接从缓存中取,就不会new了,这样拿到的就是同一个对象。当Integer i 的值不在 -128到127之间时,每次都会重新new Integer(),那么每次都会是不同的对象。所以看到这里,大家应该知道上面的两个不同的比较的结果是什么了把,前者为true,后者为false。

六、int 变量 与 Integer、 new Integer() 比较

int 变量 与 Integer、 new Integer() 比较时,只要两个的值是相等,则为true,需要说明的是包装类Integer 和 基本数据类型int 比较时,java会自动拆包装为int ,然后进行比较,实际上就变为两个int变量的比较。

Integer i = new Integer(10); //自动拆箱为 int i=10; 此时,相当于两个int的比较
int j = 10;
System.out.print(i == j); //true

看完了以上的,大家看看下面的比较大家能否写出正确的结果。

public static void comp3(){
        int i = 128;
        Integer i2 = 128;
        Integer i3 = new Integer(128);

        System.out.println("i == i2 = " + (i == i2)); // Integer会自动拆箱为int,所以为true
        System.out.println("i == i3 = " + (i == i3)); // true,理由同上

        Integer i4 = 127;// 编译时被翻译成:Integer i4 = Integer.valueOf(127);
        Integer i5 = 127;
        System.out.println("i4 == i5 = " + (i4 == i5));// true

        Integer i6 = 128;
        Integer i7 = 128;
        System.out.println("i6 == i7 = " + (i6 == i7));// false

        Integer i8 = new Integer(127);
        System.out.println("i5 == i8 = " + (i5 == i8)); // false

        Integer i9 = new Integer(128);
        Integer i10 = new Integer(128);
        System.out.println("i9 == i10 = " + (i9 == i10)); // false
    }
public static void comp4(){
        Integer a = new Integer(127), b = new Integer(128);

        int c = 127, d = 128, dd = 128;
        Integer e = 127, ee = 127, f = 128, ff = 128;

        System.out.println(a == b); // false 因为a,b都是new出来的对象,地址不同所以为false
        System.out.println(a == c); // true a会自动拆箱为int类型
        System.out.println(a == e); // false 指向的地址不同a是new出来的

        System.out.println(e == c); // true e会自动拆箱为int类型
        System.out.println(e == ee);// true Integer对 处于-128到127范围之间,指向了同一片地址区域

        System.out.println(b == f); // false 指向的地址不同b是new出来的
        System.out.println(f == d); // true f自动拆箱为int类型

        System.out.println(f == ff); /*
         * false 指向的不是同一片地址区域。
         * 在Integer类型中,-128到127存放的是同一片区域地址,
         * 之外的数是另外开辟空间来进行 存储的
         */
        System.out.println(d == dd); // true 不解释
    }
public static void comp5(){
        Integer i01 = 59;
        int i02 = 59;
        Integer i03 =Integer.valueOf(59);
        Integer i04 = new Integer(59);
        System.out.println(i01 == i02);//true
        System.out.println(i01 == i03);//true
        System.out.println(i03 == i04);//false
        System.out.println(i02 == i04);//true
    }
public static void comp6(){
        Integer i01 = 128;
        int i02 = 128;
        Integer i03 = Integer.valueOf(128);
        Integer i04 = new Integer(128);
        System.out.println(i01 == i02);//true
        System.out.println(i01 == i03);//false
        System.out.println(i03 == i04);//false
        System.out.println(i02 == i04);//true
    }

到此这篇关于你知道在Java中Integer和int的这些区别吗?的文章就介绍到这了,更多相关Integer和int的区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 如何使用HttpClient发送java对象到服务器

    如何使用HttpClient发送java对象到服务器

    这篇文章主要介绍了如何使用HttpClient发送java对象到服务器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • springBoot 项目排除数据库启动方式

    springBoot 项目排除数据库启动方式

    这篇文章主要介绍了springBoot 项目排除数据库启动方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • SpringBoot异步实现的8种方式

    SpringBoot异步实现的8种方式

    异步执行对于开发者来说并不陌生,在实际的开发过程中,很多场景多会使用到异步,本文主要介绍了SpringBoot异步实现的8种方式,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • Java 设计模式之责任链模式及异步责任链详解

    Java 设计模式之责任链模式及异步责任链详解

    顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式
    2021-11-11
  • 深入解析Java设计模式编程中观察者模式的运用

    深入解析Java设计模式编程中观察者模式的运用

    这篇文章主要介绍了Java设计模式编程中观察者模式的运用,观察者模式主要是为了将对象进行与被观察者一样的实现,需要的朋友可以参考下
    2016-02-02
  • Java 导出Excel增加下拉框选项

    Java 导出Excel增加下拉框选项

    这篇文章主要介绍了Java 导出Excel增加下拉框选项,excel对于下拉框较多选项的,需要使用隐藏工作簿来解决,使用函数取值来做选项,下文具体的操作详情,需要的小伙伴可以参考一下
    2022-04-04
  • Java中LocalCache本地缓存实现代码

    Java中LocalCache本地缓存实现代码

    本篇文章主要介绍了Java中LocalCache本地缓存实现代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Java中SpringSecurity密码错误5次锁定用户的实现方法

    Java中SpringSecurity密码错误5次锁定用户的实现方法

    这篇文章主要介绍了Java中SpringSecurity密码错误5次锁定用户的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-03-03
  • SpringBoot使用JSP作为视图模板的方法

    SpringBoot使用JSP作为视图模板的方法

    这篇文章主要介绍了SpringBoot使用JSP作为视图模板的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • java中栈和队列的实现和API的用法(详解)

    java中栈和队列的实现和API的用法(详解)

    下面小编就为大家带来一篇java中栈和队列的实现和API的用法(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05

最新评论