包装类

作者: 若兮缘 | 来源:发表于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)

相关文章

  • 6.装饰设计模式

    装饰模式 包装类的特点: 1.包装类和被包装类实现同样的接口2.包装类持有一个被包装的对象3.包装类在实现接口过程...

  • JAVA基础---Date类 SimpleDateFormat

    ## 一、包装类 ##01. 包装类概述 >* 什么是包装类? >* 基本数据类型对应的包装类 总结: 1.什么是...

  • 包装类

    包装类也是系统定义好的,可以直接用包装类:专门将简单数据类型的数据进行封装得到相应的类** 简单数据类型 ...

  • 包装类

    拥有属性、方法,可以对象化交互 Java中的包装类包括:Integer、Long、Short、Byte、Chara...

  • 包装类

    基本数据类型的包装类 包装类说明 除了Integer和Character定义的名称和对应的基本类型差异大,其他六种...

  • 包装类

    刚才接触过了Object类,可以发现Object类能够接收所有的引用数据类型(对象、数组、接口),于是这里面又出现...

  • 包装类

  • 包装类

    为什么会有基本类型包装类: 为了对基本数据类型进行更多的操作,更方便的操作,java就针对每一种基本数据类型提供了...

  • 包装类

    基本数据类型对象包装类。为了方便操作基本数据类型值,将其封装成了对象,在对象中定义了属性和行为丰富了该数据的操作。...

  • 包装类

    针对八种基本定义相应的引用类型-包装类(封装类) 针对类的特点,就可以调用类中的方法基本数据类型 包装类 ...

网友评论

      本文标题:包装类

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