Java 常用类之包装器
1、包装器
所有的基本类型都有一个对应的类,这些类被称为包装器
。包装器类是不可变的,一旦构造了包装器,就不允许更改包装在其中的值。同时,包装器类还是final
的,因此不能派生它们的子类。
2、自动装箱与自动拆箱
在需要包装器类型时,我们可以直接传递基本数据类型,编译器在编译时,会自动地插入装箱和拆箱的指令。
我们验证一下,先准备如下代码:
public class Main {
public static void main(String[] args) {
Integer n = 7;
n++;
}
}
编译代码后,反编译看看:
Code:
stack=2, locals=3, args_size=1
0: bipush 7
2: invokestatic #7 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
5: astore_1
6: aload_1
7: astore_2
8: aload_1
9: invokevirtual #13 // Method java/lang/Integer.intValue:()I
12: iconst_1
13: iadd
14: invokestatic #7 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
17: astore_1
18: aload_2
19: pop
20: return
可以看到,编译器会将 7 变换成Integer.valueOf(7)
,然后调用n.intValue()
拆箱,自增之后再调用Integer.valueOf
方法装箱。
特别注意,自动装箱规范要求 boolean、byte、char ≤ 127,介于 -128 和 127 之间的 short 和 int 被包装到固定的对象
中。
3、类型之间的转换
基本数据类型转换为 String 类型
,有以下两种方法。
String a = 7 + "";
String b = String.valueOf(7);
反编译看下:
Code:
stack=1, locals=3, args_size=1
0: ldc #7 // String 7
2: astore_1
3: bipush 7
5: invokestatic #9 // Method java/lang/String.valueOf:(I)Ljava/lang/String;
8: astore_2
9: return
可以看到,第一种方法直接从常量池中取字符 7,而没有进行连接。(常量折叠)
包装器装换为 String 类型
:先进行拆箱转换为基本数据类型,然后再将基本数据类型转换为 String 类型。
String 转换为基本数据类型
:
int n = Integer.parseInt("7");
String 转换为包装器类型
:
Integer n = Integer.valueOf("7");
如有错误,欢迎指正。.... .- ...- . .- -. .. -.-. . -.. .- -.-- -.-.--