int和Integer的区别,什么是自动装箱和自动拆箱?

版权声明:本文为博主原创文章,转载请注明出处! https://blog.csdn.net/sinat_33921105/article/details/82750371

先来说下昨天遗留下来的一个问题,也就是这道题

image

不知道你们的回答是什么,正确答案是语句2!来一起看下实际的编码。

image

可以看到,只有语句2是编译正确的,这是为什么呢?再来看下面的图示!

image

看到这里,我们或许知道怎么回事了,也就是最根本的问题就是数据类型不匹配的问题,为什么会存在编译出错,就是数据类型的问题,所以这就是一个非常基础的测试题,对了,这其实是一家公司的面试题,考察的知识点是什么呢?在我看来,最起码有这两点:

  • 两个byte类型相加,结果是int,也就是需要使用int接收
  • final定义的变量将不可变

如果你知道上面的两个知识点,那么这道题就不是问题了。所以,基础,真的很重要!

今天我们要说的int和integer也是基础相关的,牵涉到的知识点自动拆装箱也是比较重要的基础知识点!

庆哥: 你知道int和integer有什么区别吗?

小白: 这好像是基础数据类型的知识吧,记得之前你曾经提过,integer是int的包装类型,java数据类型分为基础数据类型和引用数据类型,八种基本数据类型也叫作内置数据类型,他们都有各自相对应的包装类型!

庆哥:

image

可以的,那咱来看一道题

 public static void main(String[] args) {
     Integer a = new Integer("abc");
     System.out.println(a);
    }

你说这道题有什么问题吗?

小白: 这?好像也没有什么问题吧!

image

庆哥: 那我们来看下运行结果吧

image

小白:

image

庆哥:

image

这里其实就涉及到一个知识点,那就是:

如果你传入的是这样的一个字符串,编译是可以通过的,但是运行的话
就会出错,因为Integer会将传入的数字或者字符串转换成Integer类
型,这里就要求你必须是个数字才行,也就是说引号中是数字才行,而
不能是其他,像abc是无法转换成Integer的。

如果你知道这个知识点,那么你就能很快的知道上面那种写法肯定有问题!这就是基础知识!

小白: 现在发现基础知识真的是愈发的重要啊,经过这几次你出的几道基础测试题,我发现自己的基础还真的是差劲啊,看来真的屙屎需要好好补补了。那么这个integer还有什么小注意的知识点吗?

庆哥: 上面这个知识点就是integer中我们需要掌握的知识点了,另外关于integer我们必须了解掌握的一个知识点就是自动拆装箱了,这个你了解吗?

小白: 这个我知道,听说过!

image

庆哥: 仅仅只是听说过可是不行的,我们说的可是要掌握的啊,首先要知道的是这个自动拆装箱是jdk1.5及之后的新特性,那么我们接下来就要知道这个拆箱和装箱是个什么意思?你知道吗?

小白: 拆箱子?装箱子吗?

image

庆哥: 你还别说,还真的可以这样理解,其实拆装箱我们就可以想象为把东西装进箱子里,然后从箱子里拆出来,什么意思呢?我们来结合代码看

看这个行代码

Integer a = new Integer(66);

这里的a我们知道是一个对象引用,指向的就是66这个数值对象,这个integer是int的包装类,本来我们可以这样写的。

int a = 66;

也就是使用基本数据类型直接复制即可,现在使用integer这个包装类就相当于把数字装进箱子里一样,这样就是一个对象,而不是一个简单的数值类型了,我们再看这个

int i = a.intValue();

上面的类型就是把integer这个包装类型的数据转换成int类型的基本数据类型,这个过程就好比把数据从箱子里拿出来,也就是拆箱,还原成原本的int类型!

小白: 原来这既是自动拆装箱啊!

庆哥: 不是的,这是拆装箱,但不是自动拆装箱,以上是手动拆装箱,也就是需要我们手动将数据进行int型和integer的转换,那么什么是自动拆装箱呢?看这个

 Integer b = 88;

这个就是自动装箱,也就是自动将数值转成integer类型的数据,而紧接着下面的这个就是自动拆箱了

int d = b;

也就是说这个操作

Integer b = 88;
        int d = b;

就是jdk1.5及之后新增的自动拆装箱了!

小白: 也就是可以互相自动完成转换了,变得简单了啊!

庆哥: 是的,变得简单了,那么我们来看一个问题,看下面的代码

 public static void main(String[] args) {
        Integer a = 1024;
        Integer b = 1024;
        System.out.println(a == b);
        
    }

你说上面这段代码的输出结果是什么?

小白: 必须是相等啊

image

庆哥:

结果是

image

image

你知道为什么吗?

小白: 好吧,好吧,我受打击了,这是怎么回事啊?

庆哥: 怎么回事,看来下面这个你就明白了

Integer a = 1024;
        Integer a1 = new Integer(1024);
        Integer b = 1024;
        Integer b1 = new Integer(1024);

小白: 好吧,我算是明白了,真笨!

庆哥: 不着急,再来看一个

   public static void main(String[] args) {
        Integer a = 66;
        
        Integer b = 66;
        
        System.out.println(a == b);

    }

你说这个输出的结果呢?

小白: 简单,还想坑我,必须是false啊!

image

庆哥:

你看结果

image

image

小白: 唉,这是咋个回事啊,真的很蒙圈啊!

庆哥: 其实关于integer自动拆装箱这里还有一个知识点就是

a 和 b的取值只要在-128到127之间,那么他们指的就是同一个,即使==比较的是两者的引用,两者也是相同的,因为-128到127这些数字是使用频率比较高的,就产生了一个整型常量池,这些数字会存放在这里,有相同的数字则不会再次创建,所以a和b指的是同一个,因此两者相同,当然如果是在这个范围之外的数字,那结果就是false了

小白: 我去,这个知识点还真是第一次听说,这下涨姿势了!唉,自己基础是真的差啊!

庆哥:

image

猜你喜欢

转载自blog.csdn.net/sinat_33921105/article/details/82750371