包装类

作者: 若兮缘 | 来源:发表于2018-12-21 22:04 被阅读91次
    什么是包装类?

    Java中的数据类型分为基本数据类型和引用数据类型,其中基本数据类型是不具有对象特征的,也就是说它们不能像对象一样拥有属性和方法,以及对象化交互。
    包装类的产生就是为了解决基本数据类型存在的这样一些问题,通过包装类可以让基本数据类型获取对象一样的特征,行使对象相关的权力。

    包装类与基本数据类型

    特点:
    所有包装类都是使用final修饰的,不能被继承,其中数值型对应的包装类都是继承自Number
    包装类是不可变类,包装类的对象被创建后,它所包含的基本类型数据就不能改变

    作用:
    作为和基本数据类型对应的类类型存在,方便涉及到对象的操作
    提供每种基本数据类型的相关属性如最大值、最小值等以及相关的操作方法

    包装类的使用

    1.与基本数据类型的转换

    装箱:把基本数据类型转换成包装类,分为自动装箱和手动装箱
    拆箱:把包装类转换成基本数据类型,分为自动拆箱和手动拆箱

    装箱与拆箱示例:

        //装箱:把基本数据类型转换成包装类
        //1、自动装箱
        int t1=2;
        Integer t2=t1;
        //2、手动装箱:使用构造方法
        Integer t3=new Integer(t1);
        //拆箱:把包装类转换成基本数据类型
        //1、自动拆箱
        int t4=t2;
        //2、手动拆箱:使用intValue方法
        int t5=t2.intValue();
        //拆箱为其他基本数据类型,使用对应的xxxValue方法
        double t6 = t2.doubleValue(); //2.0
    
    2.与字符串的转换

    基本数据类型转换为字符串
    — 使用包装类的toString()方法
    字符串转换为基本数据类型
    — 自动拆箱调用包装类的parseXxx()静态方法
    — 调用包装类的valueOf()方法转换为基本类型的包装类,然后自动拆箱

    示例:

        //基本数据类型转换为字符串
        int t1=2;
        String t2=Integer.toString(t1);
        //字符串转换为基本数据类型
        //1、包装类的parseXXX()
        int t3=Integer.parseInt(t2);
        //2、包装类的valueOf() 先将字符串转换为包装类,再通过自动拆箱完成基本类型转换
        int t4=Integer.valueOf(t2);
    
    3.包装类对象间的比较
        Integer one=new Integer(100);
        Integer two=new Integer(100);
        //false: 通过new关键字创建对象会开辟两块不同的内存空间
        System.out.println(one == two);
        
        Integer three = 100;
        //true: 与数值比较时会自动拆箱
        System.out.println(three == 100);
        
        Integer four = 100;
        //实际java执行的代码是:Integer four = Integer.valueOf(100);
        //为了提高运行效率,在Integer内部提供了一个缓冲区(对象池),是一个静态内部类IntegerCache
        //当参数值在[-128,127]之间时,会从缓冲区去获取对应的Integer对象
        System.out.println(three == four); //true
        
        Integer five=200;
        System.out.println(five == 200); //true
        
        Integer six=200;
        System.out.println(five==six);//false,都是new出来的,而不是从缓冲区取
    

    总结:通过new关键字创建对象其引用必然不相同,而如果使用valueOf方法则需要考虑是否会从对象常量池中取对象。
    除了FloatDoubleBoolean外其他包装类都可以应用对象常量池概念。

    包装类API

    包装类的API很多都大同小异,尤其是对于IntegerLongShort类来说API基本一致,并且包装类的大多数成员都是静态成员,这里以Integer为例进行说明

    1.构造方法

    除了Character类以外,一般均有两个构造方法
    a.以int型变量作为参数创建Integer对象:Integer num = new Integer(5);
    b.以String型变量作为参数创建Integer对象:Integer num = new Integer("5");
    注意:boolean在使用String型参数构造对象时,仅当String值忽略大小写为true其值才为true,其他值均为false

    2.常用常量

    MAX_VALUE:表示int型可取的最大值
    MIN_VALUE:表示int型可取的最小值
    SIZE:表示以二进制补码形式表示int值的位数
    TYPE:所表示的基本类型

        //int类型可取的最大值:2147483647
        System.out.println(Integer.MAX_VALUE);
        //int类型可取的最小值:-2147483648
        System.out.println(Integer.MIN_VALUE);
        //char类型可取的最大值:65535
        System.out.println(Character.MAX_VALUE + 0); //加0转为int显示
        //char类型可取的最小值:0
        System.out.println(Character.MIN_VALUE + 0);
        //int类型的二进制位数:32
        System.out.println(Integer.SIZE);
        //所表示的基本类型:int
        System.out.println(Integer.TYPE); 
    
    3.常用方法

    intValue():包装类转为int类型
    valueOf():int类型转包装类
    parseInt():字符串转int类型
    toString():包装类转为字符串
    与其他进制的转换:toHexString()十六进制、toOctalString()八进制、toBinaryString()二进制

    4.Number类

    抽象类Number是数值型(byte/short/int/long/float/double)包装类的父类。
    Number类定义了一些数值型转换的方法并被Number的各子类所实现。

    扩展

    java的包装类除了基本类型对应的8个,还包括BigIntegerBigDecimal,它们没有对应的基本类型,主要用于高精度的运算。BigInteger支持任意精度的整数,BigDecimal支持任意精度带小数点的运算。

    BigInteger

    不可变的任意精度的整数(而Integer有精度限制)
    对象创建:BigInteger bi = new BigInteger("9999999999");
    常用方法:(没有说明返回类型都是BigInteger)
    add(BigInteger val) 加法运算
    subtract(BigInteger val) 减法运算
    multiply(BigInteger val) 乘法运算
    divide(BigInteger val) 除法运算
    remainder(BigInteger val) 取余数
    divideAndRemainder(BigInteger val) 返回类型 BigInteger[]

    BigDecimal

    不可变的、任意精度的有符号十进制数,适用于对小数进行精确的计算
    对象创建:BigDecimal bd = new BigDecimal("4099.99");
    常用方法:同上,注意除法除不尽会报错

    示例:

        BigInteger bi = new BigInteger("9999999999");
        //Integer i = new Integer(9999999999); //超过int表示的范围
        BigInteger bi2 = new BigInteger("2");
        //计算
        //System.out.println(bi+bi2); //错误,引用类型不可以直接运算
        System.out.println(bi.add(bi2)); //10000000001
        System.out.println(bi.subtract(bi2)); //9999999997
        System.out.println(bi.multiply(bi2)); //19999999998
        System.out.println(bi.divide(bi2)); //4999999999
        System.out.println(bi.remainder(bi2)); //1
        BigInteger[] dar = bi.divideAndRemainder(bi2);
        System.out.println(Arrays.toString(dar)); //[4999999999, 1]
        double b = 4099.99;  //浮点数本身就是不精确的数据
        double b2 = 969.01;
        System.out.println(b-b2); //输出结果为:3130.9799999999996
        System.out.println();;    
        //使用BigDecimal解决double计算会丢失精度的问题,必须使用 String参数的构造器
        BigDecimal bd = new BigDecimal("4099.99");
        BigDecimal bd2 = new BigDecimal("969.01");
        System.out.println(bd.subtract(bd2)); //输出3130.98
        System.out.println(bd.add(bd2)); //5069.00
        System.out.println(bd.multiply(bd2)); //3972931.3099
        System.out.println(bd.divide(bd2)); //报错,除不尽(ArithmeticExceptions)
    

    相关文章

      网友评论

          本文标题:包装类

          本文链接:https://www.haomeiwen.com/subject/oozvkqtx.html