八种基本类型与其包装类的转换

八种基本类型:byte short int long float double char boolean 都有对应的包装类

 数据类型包装类字节长度默认值有效位
byteByte10-128~127
shortShort20-32768~32767
intIntrger40-2^31-1~2^31
longLong80l-2^63~2^63-1
floatFloat40.0f24(二进制)=7~8(十进制)
doubleDouble80.053(二进制)=10~11(十进制)
charCharacter2u0000 
booleanBoolean1false 

八种基本类型和其对应的封装类可以相互转换

通过故构造器手动转换转换,将基本类型转为包装类:

public void testWrapper() 
{
        int i  = 10;
        Integer integer = new Integer(i);
        //每个基本类型的封装类都有自己的构造器,传入构造参数完成封装
        //装箱操作
        System.out.println(integer);

        float f = 1.3f;
        Float f1 = new Float(f);
        System.out.println(f1);

        char a = 'A';
        Character character = new Character(a);
    }

值得注意:在JDK1.5  JDK提供了自动装箱和自动拆箱功能

基本类型可以直接转换为包装类

public void testWrapper1() {
        Integer i = new Integer(1);
        int i1  = i;
        System.out.println(i1);
        i.equals(i1);
    }

有了自动拆箱和自动装箱,基本类型与包装类的转换也更加方方便。

这里再引出一个问题:就是Integer的构造器Integer.valueOf();

这个函数有一个特殊的地方(源码的实现)

现有实例:

public void method() {
        Integer i  = new Integer(1);
        Integer j =  new Integer(2);
        System.out.println(i == j);// false

        Integer m  =1;
        Integer n = 1;
        System.out.println(m ==n);//true

        Integer x = 128;
        Integer y = 128;
        System.out.println(x == y);// false
    }

为什么会出现上述的结果?

在Integer的构造器中,有一个Byte类型的数组,主要储存-128~127的数字。

因此,在创建-128~127范围的整形时,直接将该数组中该值对应的地址付给整形对象。但是当创建的数字不在该范围时,

构造器就需要分配地址,来储存新的值。

在Integer的构造函数中,它分两种情况: 

1、i >= 128 || i < -128 =====> new Integer(i) 
2、i < 128 && i >= -128 =====> SMALL_VALUES[i + 128]

那么上面的的结果就很好理解:

  •     首先,现在为包装类,包装类中的==是比较地址,很明显,第一个1和2的地址是不同的 所以为false。
  •     第二个,因为两个1都取自相同的地址(数组中值为1对应的地址)于是结果为true
  •     第三个,由于128超过了数组的范围,因此。每当定义该变量时就需要重新分配空间,于是乎,虽然两个包装类的整形值都为128,但是,由于地址不同 因此,结果为false

拓展:八种基本类型中,有一部分的构造对象中是有类似于整形包装类的数组

这里写图片描述

这里再加入别人关于拆装箱的总结:

  1. 需要知道什么时候会引发装箱和拆箱 
  2. 装箱操作会创建对象,频繁的装箱操作会消耗许多内存,影响性能,所以可以避免装箱的时候应该尽量避免。
  3. equals(Object o) 因为原equals方法中的参数类型是封装类型,所传入的参数类型(a)是原始数据类型,所以会自动对其装箱,反之,会对其进行拆箱
  4. 当两种不同类型用==比较时,包装器类的需要拆箱, 当同种类型用==比较时,会自动拆箱或者装箱
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,有8种基本类型转换方式,分别为:自动类型转换、强制类型转换、拆箱与装箱、字符串转换基本类型基本类型转换为字符串、整数类型转换、浮点数类型转换、字符类型和布尔类型转换。 1. 自动类型转换:当把一个容量小的数据类型赋给容量大的数据类型时,会自动进行类型转换。例如,把int类型的值赋给long类型的变量,系统会自动进行类型转换。 2. 强制类型转换:当把一个容量大的数据类型赋给容量小的数据类型时,需要使用强制类型转换。例如,把long类型的值赋给int类型的变量,需要使用强制类型转换。 3. 拆箱与装箱:基本数据类型可以转换为对应的包装类,这个过程称为装箱。而包装类转换基本数据类型的过程称为拆箱。例如,int类型可以装箱为Integer类型,而Integer类型可以拆箱为int类型。 4. 字符串转换基本类型:可以使用包装类的静态方法将字符串转换为对应的基本类型。例如,使用Integer.parseInt()方法将字符串转换为int类型。 5. 基本类型转换为字符串:可以使用包装类的静态方法将基本类型转换为字符串。例如,使用Integer.toString()方法将int类型转换为字符串。 6. 整数类型转换:在不同整数类型之间进行转换时,需要注意数据溢出的问题。例如,将int类型的数据转换为byte类型时,如果超出了byte类型的取值范围,会导致数据溢出。 7. 浮点数类型转换:在不同浮点数类型之间进行转换时,也需要注意数据精度的问题。例如,将double类型的数据转换为float类型时,可能会损失一定的精度。 8. 字符类型和布尔类型转换:字符类型可以转换为整数类型进行计算,也可以转换为字符串类型进行输出。而布尔类型只能转换为字符串类型进行输出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值