大家好,欢迎来到IT知识分享网。
如果你是一个初学者,你肯定会经常听到大佬说什么拆箱会有什么空指针异常啊之类的术语,今天就来说说什么叫拆箱和装箱
一、拆箱与装箱
基本类型 | 引用数据类型 |
---|---|
int |
Integer |
char |
Character |
boolean |
Boolean |
byte |
Byte |
short |
Short |
long |
Long |
float |
Float |
double |
Double |
1.1 装箱
装箱是将基本类型转换为相应的包装类型的过程。这通常发生在需要一个对象而不是基本类型的情况下,例如在集合类(如ArrayList
)中,因为集合类只能处理对象。
1.2 自动装箱
自动装箱是指Java编译器在需要的地方自动将基本类型转换为其对应的包装类型。这是在Java 5中引入的功能,java会隐式的调用Integer.valueOf(a)方法。
int a = 10; Integer b = a; // 自动装箱,将int类型的a转换为Integer类型的b
1.3 手动装箱
手动装箱是指使用包装类型的构造方法或静态方法显式地将基本类型转换为包装类型。
int a = 10; Integer b = Integer.valueOf(a); // 使用静态方法进行手动装箱
1.4 拆箱
拆箱是将包装类型转换为其对应的基本类型的过程。这通常发生在需要一个基本类型而不是对象的情况下,例如在算术运算中。
1.5 自动拆箱
自动拆箱是指Java编译器在需要的地方自动将包装类型转换为其对应的基本类型。
Integer a = 10; int b = a; // 自动拆箱,将Integer类型的a转换为int类型的b
1.6 手动拆箱
手动拆箱是指使用包装类型的方法显式地将包装类型转换为基本类型。
Integer a = 10; int b = a.intValue(); // 使用intValue方法进行手动拆箱
二、装箱和拆箱的细节
2.1 缓存机制:
Java对某些包装类型实现了缓存机制,以提高性能和减少内存使用。这个机制适用于Byte,Short,Integer,Long,和Character。
- Byte:缓存所有值。
- Short,Integer,Long:缓存从-128到127的值。
- Character:缓存从\u0000到\u007F的值(即0到127)。
Integer a = 127; Integer b = 127; System.out.println(a == b); // 输出true,因为127在缓存范围内,a和b指向同一个对象 Integer c = 128; Integer d = 128; System.out.println(c == d); // 输出false,因为128不在缓存范围内,c和d是不同的对象
2.2 空指针异常:
在自动拆箱过程中,如果包装类型的对象为null
,会抛出NullPointerException
。
Integer wrappedInt = null; try { int primitiveInt = wrappedInt; // 试图将null对象拆箱为int,抛出NullPointerException } catch (NullPointerException e) { System.out.println("NullPointerException caught!"); }
如何解决拆箱过程中的空指针异常?
三元表达式 或者其他的这个问题要针对性的回答,不在本篇叙述
Integer wrappedInt = null; int primitiveInt = (wrappedInt != null) ? wrappedInt : 0; // 使用三元运算符提供默认值 System.out.println(primitiveInt); // 输出0
2.3 性能影响:
装箱和拆箱涉及到对象的创建和销毁,频繁的装箱和拆箱会影响性能,特别是在大规模循环或性能敏感的代码中。
int sum = 0; for (Integer i = 0; i < ; i++) { // 每次循环都会发生自动装箱和拆箱 sum += i; }
2.4 不可变性:
所有的包装类型都是不可变的,这意味着一旦创建了包装类型对象,其值就不能改变。如果需要修改值,则必须创建一个新的包装类型对象。
Integer wrappedInt = 100; wrappedInt = 200; // 实际上是创建了一个新的Integer对象,并将其引用赋给wrappedInt
2.5 包装类型的比较:
包装类型的比较需要小心。使用==
比较包装类型时,比较的是对象引用,而不是实际的值。因此,可能会得到意想不到的结果。应该使用equals()
方法来比较包装类型的值。
Integer a = 1000; Integer b = 1000; System.out.println(a == b); // 输出false,因为1000不在缓存范围内,a和b是不同的对象 System.out.println(a.equals(b)); // 输出true,因为equals()方法比较的是值
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/136140.html