什么是包装类?
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
方法则需要考虑是否会从对象常量池中取对象。
除了Float
、Double
、Boolean
外其他包装类都可以应用对象常量池概念。
包装类API
包装类的API很多都大同小异,尤其是对于Integer
、Long
、Short
类来说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个,还包括BigInteger
和BigDecimal
,它们没有对应的基本类型,主要用于高精度的运算。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)
网友评论