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");

如有错误,欢迎指正。.... .- ...- . .- -. .. -.-. . -.. .- -.-- -.-.--

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值