包装类
把基本类型进行包装,提供更加完善的功能
基本类型是没有任何功能的,只是一个变量,记录值,而包装类可以有更加丰富的功能
与基本类型对应的关系
Number
数字包装类的抽象父类
提供了各种获取值的方法
lnteger
创建对象
方式一: new Integer(5);
方式二: Integer.valueOf(5);
Integer类中包含256个Integer缓存对象,范围是 -128~127
使用valueOf()时,如果指定范围内的值,直接访问缓存对象不新建;如果指定范围外的值,直接新建对象。
常见方法
static int parseInt(String s) 将字符串参数作为有符号的十进制整数进行解析
练习Number之Intrger
练习: Number之Double
package cn.tedu.api;
public class TestNumber1 {
public static void main(String[] args) {
//创建int包装类Intger对象的方式1
Integer i1 = new Integer(100);
Integer i11 = new Integer(100);
System.out.println(i1 == i11);//false,new了两次,是两个不同的对象,地址值不同
//创建int包装类Integer对象的方式2
/*Integer有一个高效的效果,但是必须满足3个条件:
* 1.是Integer类型
* 2.使用valueOf()的创建方式
* 3.数据在-128~127的范围内
* 满足以上条件,相同的数据只会存一次,后续再使用都是以前存过的数据*/
Integer i2 = Integer.valueOf(100);
Integer i22 = Integer.valueOf(100);
System.out.println(i2 == i22);//true
Integer i3 = Integer.valueOf(300);
Integer i33 = Integer.valueOf(300);
System.out.println(i3 == i33);//false 超出高效的数据范围-128~127
//创建double包装类Double对象的方式1
Double d1 = new Double(3.14);
Double d11 = new Double(3.14);
System.out.println(d1 == d11);//false,创建两个不同的对象,地址值不同
//4.创建double包装类Double对象的方式2
/*只有Integer才有高效的效果Double是没有的*/
Double d2 = Double.valueOf(3.14);
Double d22 = Double.valueOf(3.14);
System.out.println(d1 == d2);//false
System.out.println(d2 == d22);
// 测试常用方法
//这个方法的作用就是把传入的String类型的数据转成int
/*对象是什么类型的,就可以使用这个类的所有资源
i1是Integer类型的对象,所以可以使用parseInt()将String类型的数据转为int类型
d1是Double类型的对象,所以可以使用parseDouble()将String类型的数据转为double类型*/
System.out.println(i1.parseInt("800")+8);//808->int+int
System.out.println(d1.parseDouble("2.2")+3.1);//5.300000000000001->double+double
}
}
练习: 自动装箱与自动拆箱测试
BigDecimal
BbigDecimal:常用来解决精确的浮点数运算不精确的问题
创建对象
方式一 :
BigDecimal(double val)
将double转换为BigDecimal,后者是double的二进制浮点值十进制表示形式,有坑!
方式二 :
BigDecimal(String val)
将String类型字符串的形式转换为BigDecimal
常用方法
Add(BigDecimal bd) : 做加法运算
Subtract(BigDecimal bd) : 做减法运算
Multiply(BigDecimal bd) : 做乘法运算
Divide(BigDecimal bd) : 做除法运算,除不尽时会抛异常
Divide(BigDecimal bd,保留位数,舍入方式) : 除不尽时使用
setScale(保留位数,舍入方式) : 同上
pow(int n) : 求数据的几次幂
练习:测试常用方法
创建包: cn.tedu.bigdecimal
创建类: TestBigDecimal.java
需求: 接收用户输入的两个小数,做运算
package cn.tedu.api;
import java.math.BigDecimal;
import java.util.Scanner;
public class TestBigDecimal {
public static void main(String[] args) {
//f1();//使用普通的 +-*/ 四则运算,暴露出浮点数运算不精确的问题
f2();//使用BigDecimal来解决浮点数运算不精确的问题
}
private static void f2() {
//1.提示并接收用户输入的两个小数
System.out.println("请输入您要计算的两个小数:");
double a = new Scanner(System.in).nextDouble();
double b = new Scanner(System.in).nextDouble();
//2.创建工具类对象,把基本类型a和b交给工具类对象BigDecimal来保存
/*1.最好不要用double作为构造函数的参数,不然还会有不精确的现象,有坑!!!*/
/*2.最好使用重载的,参数类型是String的构造函数
* double转String,直接拼个空串就可以*/
BigDecimal bd1 = new BigDecimal(a+"");
BigDecimal bd2 = new BigDecimal(b+"");
//3.通过BigDecimal的对象来调用其方法,实现精确运算
//3.1 定义BigDecimal类型的引用类型变量来保存结果
BigDecimal bd3;
//3.2 Add(BigDecimal bd) : 做加法运算
bd3 = bd1.add(bd2);
System.out.println(bd3);
//3.3 Subtract(BigDecimal bd) : 做减法运算
bd3 = bd1.subtract(bd2);
System.out.println(bd3);
//3.4 Multiply(BigDecimal bd) : 做乘法运算
bd3 = bd1.multiply(bd2);
System.out.println(bd3);
//3.5 Divide(BigDecimal bd) : 做除法运算,除不尽时会抛异常
/*3.除法运算,除不尽时会抛出异常ArithmeticException*/
//方案一:(除不尽时有问题)
//bd3 = bd1.divide(bd2);
/*divide(m,n,o)
m是要除以哪个对象,n指要保留几位,o指舍入方式(比如四舍五入)*/
//方案二:
bd3 = bd1.divide(bd2,3,BigDecimal.ROUND_HALF_UP);
System.out.println(bd3);
}
private static void f1() {
//1.提示并接收用户输入的两个小数
System.out.println("请输入您要计算的两个小数:");
double a = new Scanner(System.in).nextDouble();
double b = new Scanner(System.in).nextDouble();
//2.做运算
System.out.println(a + b);//不精确
System.out.println(a - b);//不精确
System.out.println(a * b);//不精确
System.out.println(a / b);//不精确
}
}