详解Java包装类及自动装箱拆箱

作者:Kevin_Lyz 时间:2023-11-14 21:13:23 

Java包装类


基本类型大小包装器类型
boolean/Boolean
char16bitBoolean
byte8bitByte
short/16bitShort
int32bitInteger
long64bitLong
float32bitFloat
double64bitDouble
void/Void


Java 的包装类有两个主要的目的:

  1. Java包装类将基本数据类型的值“包装”到对象中,对基本数据类型的操作变为了对对象进行操作,从而使基本值能够包含在为对象为保留的操作中。比如向Collections中添加元素(泛型的操作限制加入的只能是对象,比如List = new ArrayList() 的写法是错误的),或者从带对象返回值的方法中返回。

  2. 更加方便类型的转换,如常见的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

标签:Java包装类,拆箱,装箱
0
投稿

猜你喜欢

  • Java synchronized关键_动力节点Java学院整理

    2023-11-10 11:08:53
  • Java实现的对称加密算法AES定义与用法详解

    2021-10-16 22:16:05
  • C# 多线程学习之基础入门

    2022-11-08 05:38:13
  • Idea springboot如何实现批量启动微服务

    2022-09-08 09:04:07
  • Java线程同步机制_动力节点Java学院整理

    2023-08-01 10:29:47
  • Android开发使用Drawable绘制圆角与圆形图案功能示例

    2023-08-26 21:07:09
  • Java自定义实现链队列详解

    2023-06-22 12:47:31
  • 详解C# WinForm如何实现自动更新程序

    2022-03-04 02:19:29
  • 使用JAVA实现http通信详解

    2023-11-12 12:21:12
  • C#使用XML序列化操作菜单的方法

    2022-08-03 08:54:34
  • Android ImageButton自定义按钮的按下效果的代码实现方法分享

    2021-11-20 13:52:07
  • SpringBoot注册Servlet的三种方法详解

    2022-06-15 15:56:29
  • Java设置PDF跨页表格重复显示表头行的步骤详解

    2023-09-21 23:50:33
  • Java获取字符串编码格式实现思路

    2023-08-14 12:35:38
  • Java设计模式--代理模式

    2023-02-26 21:45:32
  • DialogFragment运行原理及使用方法详解

    2023-10-27 04:00:26
  • 一文详解Android无需权限调用系统相机拍照

    2022-06-22 03:08:26
  • JavaMail入门教程之发送邮件(3)

    2023-02-01 20:01:16
  • c# 模拟串口通信 SerialPort的实现示例

    2023-09-03 22:19:50
  • java -jar设置添加启动参数实现方法

    2022-04-26 21:05:37
  • asp之家 软件编程 m.aspxhome.com