100天面试第八天——Java自动装箱和自动拆箱源码分析

Posted 100天面试

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了100天面试第八天——Java自动装箱和自动拆箱源码分析相关的知识,希望对你有一定的参考价值。

100天面试任意门

更多请点击最下方“阅读原文



分享一些最近比较关注的知识

原文请见链接

侵权告知速删





自动装箱(boxing)和自动拆箱(unboxing)

首先了解下Java的四类八种基本数据类型


自动装箱

Java中所谓的装箱通俗点就是:八种基本数据类型在某些条件下使用时,会自动变为对应的包装器类型。

如下清单1:

100天面试第八天——Java自动装箱和自动拆箱源码分析

输出:


1

2

true

false



解释下清单1第11句输出true的原因:

当包装器类型进行“==”比较时,i3会调用Integer.valueOf自动装箱基本数据类型为包装器类型

100天面试第八天——Java自动装箱和自动拆箱源码分析


从源码中可以看出,Integer对象自动缓存int值范围在low~high(-128~127),如果超出这个范围则会自动装箱为包装类

这个是不一定的,要看具体的值是多少,所以这时候考官问我们这个问题我们应该答不清楚

Note:

  1. Integer、Short、Byte、Character、Long这几个包装类的valueOf方法的实现是类似的;

  2. Double、Float的valueOf方法的实现是类似的。

  3. Boolean的valueOf方法的实现是个三目运算,形如 return (b ? TRUE : FALSE);  `


 

自动拆箱

Java中所谓的拆箱通俗点就是:八种包装器类型在某些条件下使用时,会自动变为对应的基本数据类型。

清单2:

100天面试第八天——Java自动装箱和自动拆箱源码分析


输出:

1

2

true

true

解释下清单2第10句输出true的原因:

当程序执行到第10句时,i4会调用Integer.intValue方法自动拆箱包装器类型为基本数据类型。

100天面试第八天——Java自动装箱和自动拆箱源码分析


从源码可以看出,当包装器类型和基本数据类型进行“==”比较时,包装器类型会自动拆箱为基本数据类型。

清单3内容如下:

100天面试第八天——Java自动装箱和自动拆箱源码分析


输出:

1

2

3

4

true

false

true

true

解释第15句为什么会输出true:

因为在Integer包装类实现的equals方法中,只要比较的当前对象是Integer实例,那么就会自动拆箱为基本数据类型。从以下Integer类的equals方法的源码就可看出:


Note:

  1. Integer、Short、Byte、Character、Long这几个包装类的intValue方法的实现是类似的;

  2. Double、Float的intValue方法的实现是类似的。

  3. Boolean的booleanValue方法的实现和intValue方法的实现也是类似的。


装箱拆箱综合清单:


输出:

1

2

3

4

5

6

7

true

false

true

true

true

false

true

 这里面需要注意的是: “==”运算符的两个操作数都是包装器类型的引用,则是比较指向的是否是同一个对象,而如果其中有一个操作数是表达式(即包含算术运算)则比较的是数值(即会触发自动拆箱的过程)另外,对于包装器类型,equals方法并不会进行类型转换。

 

 


原文链接:

http://www.importnew.com/16612.html




100天面试任意门

更多请点击最下方“阅读原文

以上是关于100天面试第八天——Java自动装箱和自动拆箱源码分析的主要内容,如果未能解决你的问题,请参考以下文章

java 自动装箱和自动拆箱

java 自动装箱拆箱

JAVA学习笔记-自动装箱和自动拆箱(包装类)

java 1.5 自动拆箱和装箱的注意事项

Java自动装箱和拆箱

如何理解Java中的自动拆箱和自动装箱?