day12 API01-2正则表达式、包装类、自动装箱/拆箱、BigDecimal

1.正则表达式

1.1概念:判断用户输入的内容是否符合格式的要求(规则),注意是严格区分大小写的。

1.2常用语法:

1.3String提供了支持正则表达式的方法

1.定义一个正则表达式:String regex = "我们定义要匹配的规则";

2.判断是否符合这个表达式matches()

Matches(正则) : 当前字符串能否匹配正则表达式
replaceAll(正则,子串) : 替换子串
split(正则) : 拆分字符串

练习:测试输入身份证号

package cn.tedu.api;

import java.util.Scanner;

/*本类练习正则表达式*/
public class TestRegex {
    public static void main(String[] args) {
         //1.提示并接收用户的输入
        System.out.println("请输入你的身份证号:");
        String input = new Scanner(System.in).nextLine();

        //2.编辑正则表达式
        //身份证号的规律:一般是18位,最后一位有可能是X,或者数字
        //String regex = "[0-9]{17}[0-9X]";
        /*单个斜杠\在程序中被认为是一个转义字符,若真的需要写一个斜杠
        就需要在这个斜杠前面再加一个用来转移的斜杠,表示真的要输入一个斜杠*/
        String regex = "\\d{17}[0-9X]";

        //3.
        if(input.matches(regex)){
            System.out.println("输入正确!");
        }else{
            System.out.println("输入错误!");
        }
    }
}

2.包装类

1.对基本类型进行封装,提供一些其他功能,基本类型是没有任何功能的,只是一个变量,记录值,而包装类可以有更加丰富的功能

2.1基本类型对应的包装类

包装类型未被赋值时的默认值是null

2.2Number类

数字包装类的抽象父类。
提供了各种获取值的方式。API寻找

2.2-1 Integer类

创建对象
方式一: Integer i = new Integer(5);--没有高效的效果
方式二: Integer i = Integer.valueOf(5);--有高效效果,限制范围[-128~127]
Integer类中包含256个Integer缓存对象,范围是 -128~127
TIPS:使用valueOf()时,如果指定范围内的值,直接访问缓存对象不用新建;如果指定范围外的值,直接新建对象

练习:测试常用包装类Integer

package cn.tedu.api;
/*本类测试常用包装类*/
public class TestNumber {
   static Integer i0;
    public static void main(String[] args) {
        /*1.Integer类型的默认值是null*/
        //1.测试包装类型的默认值
        System.out.println(i0);//null
        
        //2.创建Integer类型对象,方式一:
        Integer i1 =  new Integer(5);
        Integer i2 =  new Integer(5);
        System.out.println(i1 == i2);//false,比较的是两个对象的地址值
        
        //3.创建Integer类型对象,方式二:
        /*Integer类型的数据,使用valueOf()创建方式,有高效的效果,注意范围(—128-127)
        * 在此范围内,数据只会存一次,后续再存都是直接使用之前存过的数据*/
        Integer i3 = Integer.valueOf(127);
        Integer i4 = Integer.valueOf(127);
        System.out.println(i3 == i4);//true,有Integer高效效果

        Integer i5 = Integer.valueOf(300);
        Integer i6 = Integer.valueOf(300);
        System.out.println(i5 == i6);//false,超出范围,没有Integer的高效效果
        
    }
}

2.2-2 Double类

创建方式:

方式一: Double i = new Double(3.14);
方式二: Double i = Double.valueOf(3.14);

TIPS:无论哪种创建方式,Double类都没有高效效果

注意:/*把字符串类型转成对应的包装类型,方便参与计算*/
i1.parseInt("600")+10.5--》610.5----i1是Integer类型的对象
d1.parseDouble("2.2")+1--》3.2------d1是Double类型的对象
 //测试Double包装类创建对象
        Double d1 =new Double(3.14);
        Double d2 =new Double(3.14);
        System.out.println(d1 == d2);//false,同一种方式创建出来的两个不同对象

        Double d3 = Double.valueOf(3.14);
        Double d4 = Double.valueOf(3.14);
        System.out.println(d3 == d4);//两种不同的对象,没有高效效果
        System.out.println(d2 == d3);//两种不同创建方式,也是两个不同的对象

        /*把字符串类型转成对应的包装类型,方便参与计算*/
        System.out.println(i1.parseInt("600")+10.5);//610.5
        System.out.println(d1.parseDouble("2.2")+1);//3.2

parseInt(String s)-->Integer包装类型提供的方法:把String类型的数据转成int类型参与运算

parseDouble(String s)-->Double包装类型提供的方法:把String类型的数据转成double类型参与运算

3.自动装箱和自动拆箱

自动装箱:基本类型  转成  包装类型

自动拆箱:包装类型  转成  基本类型

练习:测试自动装箱和自动拆箱

package cn.tedu.api;
/*本类测试自动装箱和自动拆箱*/
public class TestBox {
    public static void main(String[] args) {
        //1.通过两种方式创建Integer类型的对象
        Integer i1 = new Integer(127);
        Integer i2 = Integer.valueOf(127);

        /*自动装箱:
        * 编译器会自动把int基本类型的127转换成Integer包装类型的127
        * 然后交给引用类型变量i3来保存,自动装箱底层方式的代码:
        * Integer。valueOf(127);注意方向:int--> Integer*/
        Integer i3 = 127;//不会报错,会发生自动装箱

        /*自动拆箱:
        编译器会自动把Integer包装类型的i1中保存的127交给int基本类型的i4来保存
        自动拆箱底层发生的代码:i1.intValue();
        注意方向:Integer --> int
         */
        int i4 = i1;//不会报错,会发生自动拆箱
    }
}

4.BigDecimal

作用:常用来解决浮点数运算不精确的问题

创建对象:

方式一 :
BigDecimal bd = new BigDecimal(double val)
将double转换为BigDecimal,后者是double的二进制浮点值十进制表示形式,有坑!除法会报错
方式二 :
BigDecimal bd =new BigDecimal(String val)

或者

BigDecimal bd = new BigDecimal(double val +" ");//浮点数后加个双引号转成String类型
将String类型字符串的形式转换为BigDecimal,这样就可以进行除法运算了

TIPS:除法可能会出现除不尽的现象,会报错,需要设置保留的位数和舍入方式

bd3 = bd1.divide(bd2,3,BigDecimal.ROUND_HALF_UP);//保留小数后三位,四舍五入

加减乘除:

1)add(BigDecimal bd) : 做加法运算
2)subtract(BigDecimal bd) : 做减法运算
3)multiply(BigDecimal bd) : 做乘法运算
4)divide(BigDecimal bd) : 做除法运算,除不尽时会抛异常
5)divide(BigDecimal bd,保留位数,舍入方式) : 除不尽时使用***

练习;解决浮点数运算不精确的问题

package cn.tedu.bigdecimal;
import java.math.BigDecimal;
import java.util.Scanner;
/*本类解决浮点数运算不精确的问题*/
public class TestBigDecimal {
    public static void main(String[] args) {
        //f1();//用来暴露浮点数运算不精确且随机的问题
        f2();//浮点数运算不精确解决方案
    }

    private static void f2() {
        //3.提示并接收用户输入的两个小数
        System.out.println("请输入要计算的两个小数:");
        double d1 = new Scanner(System.in).nextDouble();
        double d2 = new Scanner(System.in).nextDouble();

        //4.创建工具类对象,把数据交给BigDecimal对象来保存
        BigDecimal bd1 = new BigDecimal(d1+"");//加双引号double类型转成String类型
        BigDecimal bd2 = new BigDecimal(d2+"");

        //5.定义一个变量来保存要计算的结果
        /*注意:不要使用double参数的构造方法,因为还是不精确的结果,
        要使用参数类型为 String的构造方法
        double转String,直接拼接一个双引号即可*/
        BigDecimal bd3;

        bd3 = bd1.add(bd2);//加法
        System.out.println(bd3);

        bd3 = bd1.subtract(bd2);//减法
        System.out.println(bd3);

        bd3 = bd1.multiply(bd2);//乘法
        System.out.println(bd3);

        /*由于除法会出现除不尽的现象,数据仍没法精确展示
        * 所以需要提前设置除不尽时保留的位数以及舍入规则*/
       // bd3 = bd1.divide(bd2);//除法,会除不尽,需要保留几位
        //三个参数:除谁,除不尽时保留的位数,舍入方式
        bd3 = bd1.divide(bd2,3,BigDecimal.ROUND_HALF_UP);//保留小数后三位,四舍五入
        System.out.println(bd3);



    }

    private static void f1() {
        //1.提示并接收用户输入的两个小数
        System.out.println("请输入要计算的两个小数:");
        double d1 = new Scanner(System.in).nextDouble();
        double d2 = new Scanner(System.in).nextDouble();

        //2.打印两个小数四则运算结果
        System.out.println(d1 + d2);
        System.out.println(d1 - d2);//2.6999999999999993
        System.out.println(d1 * d2);
        System.out.println(d1 / d2);

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值