int和Integer的区别,什么是自动装箱和自动拆箱?
发布日期:2021-06-30 11:38:14 浏览次数:2 分类:技术文章

本文共 2608 字,大约阅读时间需要 8 分钟。

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

在这里插入图片描述

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YdP4aGyf-1595753811858)(http://i68.tinypic.com/2nc2lud.png)]

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

在这里插入图片描述

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

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

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

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

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

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

庆哥:

可以的,那咱来看一道题

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

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

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

在这里插入图片描述

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

在这里插入图片描述

小白:

在这里插入图片描述

庆哥:

在这里插入图片描述

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

如果你传入的是这样的一个字符串,编译是可以通过的,但是运行的话

就会出错,因为Integer会将传入的数字或者字符串转换成Integer类
型,这里就要求你必须是个数字才行,也就是说引号中是数字才行,而
不能是其他,像abc是无法转换成Integer的。

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

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

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

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

在这里插入图片描述

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

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

在这里插入图片描述

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

看这个行代码

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);            }

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

小白: 必须是相等啊

在这里插入图片描述

庆哥:

结果是

在这里插入图片描述

在这里插入图片描述

你知道为什么吗?

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

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

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啊!

在这里插入图片描述

庆哥:

你看结果

在这里插入图片描述

在这里插入图片描述

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

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

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

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

庆哥:

在这里插入图片描述

转载地址:https://ithuangqing.blog.csdn.net/article/details/82750371 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:打算写一写jvm相关的文章了!今天先考查你几个易混淆的概念!
下一篇:这次我们来看看equals()与hashCode(),你还记得他们吗?

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年05月03日 13时13分45秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章