详解Java包装类及自动装箱拆箱
作者:Kevin_Lyz 时间:2023-11-14 21:13:23
Java包装类
基本类型 | 大小 | 包装器类型 |
---|---|---|
boolean | / | Boolean |
char | 16bit | Boolean |
byte | 8bit | Byte |
short | /16bit | Short |
int | 32bit | Integer |
long | 64bit | Long |
float | 32bit | Float |
double | 64bit | Double |
void | / | Void |
Java 的包装类有两个主要的目的:
Java包装类将基本数据类型的值“包装”到对象中,对基本数据类型的操作变为了对对象进行操作,从而使基本值能够包含在为对象为保留的操作中。比如向Collections中添加元素(泛型的操作限制加入的只能是对象,比如List = new ArrayList() 的写法是错误的),或者从带对象返回值的方法中返回。
更加方便类型的转换,如常见的Integer向字符的转换
装箱和拆箱
Java 在SE5之后提供了自动的装箱和拆箱机制。基本数据类型可以和与其对应的包装类之间自动进行转换
如:
Integer i = 10;
int index = i;
装箱就是自动将基本数据类型转换为包装器类型
拆箱就是自动将包装器类型装换为基本数据类型
在装箱的时候自动调用的是Integer的valueOf(int)方法。而在拆箱的时候自动调用的是Integer的intValue方法。
其他的也类似,比如Double、Character,不相信的朋友可以自己手动尝试一下。
因此可以用一句话总结装箱和拆箱的实现过程:
装箱过程是通过调用包装器的valueOf方法实现的,而拆箱过程是通过调用包装器的xxxValue方法实现的。(xxx代表对应的基本数据类型)。
面试问题
下面这段代码的输出结果是什么?
public class Main {
public static void main(String[] args) {
Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 200;
Integer i4 = 200;
System.out.println(i1==i2);
System.out.println(i3==i4);
}
}
注意 ==和equals的区别:
|类型| == |equals
|–|--|–|
| 基本数据类型 | 值 | 不可用
| 包装类 | 地址 | 内容
输出的结果为:
true
false
为什么会出现这样的结果?输出结果表明 i1 和 i2 指向的是同一个对象,而 i3 和 i4 指向的是不同的对象。此时只需一看源码便知究竟,下面这段代码是Integer的valueOf方法的具体实现:
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
从这2段代码可以看出,在通过valueOf方法创建Integer对象的时候,如果数值在 [-128,127] 之间,便返回指向IntegerCache.cache中已经存在的对象的引用;否则创建一个新的Integer对象。
上面的代码中 i1 和 i2 的数值为100,因此会直接从cache中取已经存在的对象,所以 i1 和 i2 指向的是同一个对象,而 i3 和 i4 则是分别指向不同的对象。
下面这段代码的输出结果是什么?
public class Main {
public static void main(String[] args) {
Double i1 = 100.0;
Double i2 = 100.0;
Double i3 = 200.0;
Double i4 = 200.0;
System.out.println(i1==i2);
System.out.println(i3==i4);
}
}
也许有的朋友会认为跟上面一道题目的输出结果相同,但是事实上却不是。实际输出结果为:
false
false
至于具体为什么,读者可以去查看Double类的valueOf的实现。
在这里只解释一下为什么Double类的valueOf方法会采用与Integer类的valueOf方法不同的实现。很简单:在某个范围内的整型数值的个数是有限的,而浮点数却不是。
注意,Integer、Short、Byte、Character、Long这几个类的valueOf方法的实现是类似的,Double、Float的valueOf方法的实现是类似的
以上所述是小编给大家介绍的Java包装类及自动装箱拆箱详解整合,希望对大家有所帮助。
来源:https://blog.csdn.net/qq_31749835/article/details/88662590
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Java synchronized关键_动力节点Java学院整理
Java实现的对称加密算法AES定义与用法详解
![](https://img.aspxhome.com/file/2023/9/97819_0s.png)
C# 多线程学习之基础入门
![](https://img.aspxhome.com/file/2023/1/86961_0s.png)
Idea springboot如何实现批量启动微服务
![](https://img.aspxhome.com/file/2023/1/88171_0s.png)
Java线程同步机制_动力节点Java学院整理
Android开发使用Drawable绘制圆角与圆形图案功能示例
Java自定义实现链队列详解
![](https://img.aspxhome.com/file/2023/6/57426_0s.png)
详解C# WinForm如何实现自动更新程序
![](https://img.aspxhome.com/file/2023/1/119421_0s.png)
使用JAVA实现http通信详解
![](https://img.aspxhome.com/file/2023/4/61924_0s.png)
C#使用XML序列化操作菜单的方法
Android ImageButton自定义按钮的按下效果的代码实现方法分享
SpringBoot注册Servlet的三种方法详解
![](https://img.aspxhome.com/file/2023/1/78921_0s.png)
Java设置PDF跨页表格重复显示表头行的步骤详解
![](https://img.aspxhome.com/file/2023/9/84629_0s.png)
Java获取字符串编码格式实现思路
Java设计模式--代理模式
![](https://img.aspxhome.com/file/2023/5/64885_0s.jpg)
DialogFragment运行原理及使用方法详解
![](https://img.aspxhome.com/file/2023/1/106851_0s.jpg)
一文详解Android无需权限调用系统相机拍照
JavaMail入门教程之发送邮件(3)
![](https://img.aspxhome.com/file/2023/5/71215_0s.jpg)
c# 模拟串口通信 SerialPort的实现示例
![](https://img.aspxhome.com/file/2023/3/87023_0s.png)