当前位置 博文首页 > 程序员漫话编程的博客:面试官:解释一下Java的int和integer的区

    程序员漫话编程的博客:面试官:解释一下Java的int和integer的区

    作者:[db:作者] 时间:2021-09-18 18:51

    有情怀,有干货,微信搜索【程序员漫话编程】关注这个技术控程序员。
    本文?GitHub?https://github.com/ProceduralZC/JavaDevGuide?已收录,有一线大厂面试完整考点、资料以及我的系列文章。

    上次说到我面试字节的事情,今天说的就是有关面试中的一道题,其实在面试字节中我发现这些大厂非常重视一些基础的细节问题。

    所以为了能帮助更多的人,我会一个一个全部输出。

    好了,我们开始今天的知识点,int和integer的比较,我相信大部分人看到会说这个是一样的啊。一样不一样你继续往下看,我相信看完这篇文章绝对让你一下之全明白。

    1,概念

    概念在这里主要讲他们是什么?

    int是基本数据类型,int变量存储的是数值。
    Integer是引用类型,实际是一个对象,Integer存储的是引用对象的地址。


    2,Java基本数据类型及其封装类

    为什么我们要说基本数据类型和封装类呢?因为int和Integer的关系就是基本数据类型和封装类的关系。

    我们接着往下看,都有哪些基本数据类型和封装类?
    ?

    数据类型

    字节大小

    封装类

    byte

    8位

    Byte

    short

    16位

    Short

    int

    32位

    Interger

    long

    64位

    Long

    float

    32位

    Float

    double

    64位

    Double

    boolean

    1位

    Boolean


    看到这个类型图了吗?int的封装类就是Interger。
    ?

    Java数据类型有基本数据类型和引用数据类型,为了方便将基本数据类型当作对象处理,Java引入了基本数据类型相对应的封装类,如int封装类是Integer。


    3,Int和Interger的相互转换

    两者之前的相互转换 其实还有一个更官方的名称叫:自动拆箱和自动装箱

    我们先来说一下拆箱和装箱的概念吧!

    1、自动装箱 自动装箱其实就是将基本数据类型转换为引用数据类型(对象)
    2、自动拆箱 自动拆箱其实就是将引用数据类型转化为基本数据类型


    看完概念肯定基本明白了,就是相互转化的过程。如果你还是不明白,那你继续往下看代码,来一个实找,搞定它。
    ?????

    public static void main(String[] args) {
     Integer a = 1;//这里就用到了自动装箱;等同于Integer a = new Integer(1);
     int b = a - 1;//对象不能直接进行计算,所以这里有自动拆箱的操作,将a对象转换成基本数据类型,然后-1
      System.out.println(a);
      System.out.println(b);  
    }

    4,Int和Interger的区别
    说了这么多,我来总结一下他们两个的区别,通过区别会更清晰

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

    5,Int和Interger的内存比较
    ?

    Integer对象会占用更多的内存。Integer是一个对象,需要存储对象的元数据。
    但是int是一个原始类型的数据,所以占用的空间更少

    6,Int和Interger的比较实例

    概念最少缺少点事实根据,下面通过几个实例来一个一个的展示说明,让你完全理解,好了 继续往下看吧。

    实例1
    ??????

    Integer i = new Integer(100);
    Integer j = new Integer(100);
    System.out.print(i == j); //false

    分析:两个通过new生成的变量实际上是两个Integer对象的引用,所以两个变量永远是不相等的(因为new生成的是两个对象,是对对象的引用,其内存地址不同)。

    实例2

    Integer i = new Integer(100);
    int j = 100;
    System.out.print(i == j); //true


    分析:Integer变量和int变量比较时,只要两个变量的值是相等的,则结果为true.
    因为包装类Integer和基本数据类型int比较时,Java会自动拆箱为int,然后进行比较,实际上就变为两个int变量的比较

    实例3

    Integer i = new Integer(100);
    Integer j = 100;
    System.out.print(i == j); //false

    分析:非new生成的Integer变量和new Integer()生成的变量比较时,结果为false。
    因为非new生成的Integer变量指向的是Java常量池中的对象,而new Integer()生成的变量指向堆中新建的对象的引用,它们在内存中的地址不同。

    实例4

    Integer i = 100;
    Integer j = 100;
    System.out.print(i == j); //true

    分析:对于两个非new生成的Integer对象,进行比较时,如果两个变量的值在区间-128到127之间,则比较结果为true,如果两个变量的值不在此区间,则比较结果为false。

    上面的实例明显是值100,在-128到127之间。我来做一个超出这个区间的。
    ??????

    Integer i = 128;
    Integer j = 128;
    System.out.print(i == j); //false

    这时结果就是false。

    Java对于-128到127之间的数会做缓存,当 Integer i = 127时,会将127进行缓存,下次再写Integer j = 127时,就会直接从缓存中取,不需要new了。
    ?

    我:好了面试官我回答完毕了,你还有什么要说的吗?
    面试官:嗯 嗯?? 没有了,那就下一个问题吧!


    好了,今天的这篇文章,虽然短而小,但是很清晰,通俗易懂,能更好,更快的学到这个知识点。

    支持我就毫无犹豫的 转发 吧!!!!!!

    文章持续更新,可以微信搜一搜「?程序员漫话编程?」第一时间阅读,回复【实战项目】有我准备的一线大厂面试资料和实战项目学习资源。
    本文?GitHub?https://github.com/ProceduralZC/JavaDevGuide?已经收录,有大厂面试完整考点,欢迎Star。

    cs