飞道的博客

新手小白学JAVA 正则表达式 包装类 自动装箱/自动拆箱 BigDecimal

282人阅读  评论(0)

1 正则表达式Regex

1.1 概述

正确的字符串格式规则。
常用来判断用户输入的内容是否符合格式的要求,注意是严格区分大小写的。

1.2 常见语法

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

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

1.4 练习:测试输入身份证号

创建包: cn.tedu.api
创建类: TestRegex.java

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位,前17位都是数字,最后一位可能是数字,也有可能是X
        //String regex = "[0-9]{17}[0-9X]";
        /*单个\在java中有特殊的意义,认为这是一个转义符号
        * 所以如果你想单纯的表示这就是一个\,需要在它的前面加一个用来转义的\
        * 也就是\\*/
        String regex = "\\d{17}[0-9X]";

        //3.判断用户输入的数据是否符合正则表达式的规则(也就是说用户输入的身份证号是否正确)
        if(input.matches(regex)){
   
            System.out.println("恭喜您!输入正确!");
        }else {
   
            System.out.println("输入不正确!");
        }
    }
}

2 包装类

把基本类型进行包装,提供更加完善的功能。
基本类型是没有任何功能的,只是一个变量,记录值,而包装类可以有更加丰富的功能

2.1 与基本类型的对应关系

2.2 Number

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

2.3 Integer

创建对象

方式一: new Integer(5);
方式二: Integer.valueOf(5);
Integer类中包含256个Integer缓存对象,范围是 -128~127
使用valueOf()时,如果指定范围内的值,直接访问缓存对象不新建;如果指定范围外的值,直接新建对象。

常见方法

static int parseInt(String s) 将字符串参数作为有符号的十进制整数进行解析

2.4 练习: Number之Integer

创建包: cn.tedu. api
创建类: TestNumber.java

package cn.tedu.api;
/*本类用于测试包装类*/
public class TestNumber {
   
    //1.定义成员变量,注意要定义成静态的,因为静态只能调用静态
    static Integer i0;//成员变量可以不初始化
    public static void main(String[] args) {
   
        /*1.Integer包装类型的默认值是null*/
        //2.打印i0进行测试
        System.out.println(i0);//默认值为null

        //3.创建int类型对应包装类型Integer方式一
        Integer i1 = new Integer(5);
        Integer i11 = new Integer(5);
        System.out.println(i1 == i11);//false,==比较地址值

        //4.创建int类型对应包装类型Integer方式二
        /*2.Integer有一个高效的效果(-128~127)
        * 在此范围内,相同的数据只会存一次,后续再存都是使用之前存过的数据*/
        Integer i2 = Integer.valueOf(127);
        Integer i3 = Integer.valueOf(127);
        System.out.println(i1 == i2);//false,比较的是地址值
        System.out.println(i2 == i3);//true,Integer在范围内有高效效果
        Integer i4 = Integer.valueOf(300);
        Integer i5 = Integer.valueOf(300);
        System.out.println(i4 == i5);//false,超出Integer高效范围
    }
}

2.5 Double

创建对象

  1. new Double(3.14)
  2. Double.valueOf(3.14)//和 new 没有区别

常用方法

Double.parseDouble();

2.5 练习: Number之Double

创建包: cn.tedu.api
创建类: TestNumber.java

package cn.tedu.api;
/**本类用于测试包装类*/
public class Test5_Number {
   
	public static void main(String[] args) {
   
		//1.创建int基本类型的包装类Integer的对象方式1
		/**1.Integer包装类的默认值是null*/
		Integer i0;
		Integer i1 = new Integer(5);
		//2.创建int基本类型的包装类Integer的对象方式2
		/**2.Integer有一个高效的效果(-128~127)
		 * 因为静态的valueOf(),相同的数据只会存一次,后续再存都会使用已经存过的数据
		 * */
		Integer i2 = Integer.valueOf(127);
		Integer i3 = Integer.valueOf(127);
		
		Integer i4 = Integer.valueOf(300);
		Integer i5 = Integer.valueOf(300);
		
		System.out.println(i1==i2);//false,==比较的是地址值
		System.out.println(i2==i3);//true,是Integer,并且是在(-128~127)范围内,相同数据只存一次
		System.out.println(i4==i5);//false,是Integer,但是不在(-128~127)范围内,所以存了两次,两个对象
		
		//3.创建Double对象
		Double d1 = new Double(3.4);
		Double d2 = Double.valueOf(3.4);
		Double d3 = Double.valueOf(3.4);
		
		System.out.println(d2==d3);//false,只有Integer包装类有高效的效果
		
		//4.测试常用方法
		//原因:parseInt()已经把字符串8000转换成了int类型的数字8000,可以参与运算
		System.out.println(i1.parseInt("8000")+10);//8010,执行了加法运算
		System.out.println(d1.parseDouble("2.2")+1);//3.2,执行了加法运算
	}
}

3 自动装箱和自动拆箱

3.1 概述

自动装箱:把 基本类型 包装成对应的 包装类型 的过程
Integer a = 5;//a是引用类型,引用了包装对象的地址。
编译器会完成对象的自动装箱:Integer a = Integer.valueOf(5);

自动拆箱:从包装类型的值,自动变成 基本类型的值
int i = a;//a现在是包装类型,没法给变量赋值,需要把5取出来。
编译器会完成自动拆箱:int i = a.intValue();

3.2 练习: 自动装箱与自动拆箱测试

创建包: cn.tedu.api
创建类: TestBox.java

package cn.tedu.api;
/**本类用来测试自动装箱与自动拆箱*/
public class TestBox {
   
	public static void main(String[] args) {
   
		//1.定义包装类型的数据
		//之前的方式:创建包装类型的两种方式:
		Integer i11 = new Integer(127);
		Integer i22 = Integer.valueOf(127);
		//现在的方式:
		/**1.自动装箱:编译器会自动把基本类型int数据5,包装成包装类型Integer,然后交给i1保存
		 * 自动装箱底层发生的代码:Integer.valueOf(5);
		 * valueOf()的方向:int --> Interger
		 * */
		Integer i1 = 5;//不会报错,这个现象就是自动装箱
		
		/**2.自动拆箱:编译器会自动把包装类型的5,拆掉箱子,变回到基本类型数据5
		 * 自动拆箱底层发生的代码:i1.intValue()
		 * intValue()的方向:Integer --> int
		 * */
		int i2 = i1;//不会报错,这个现象就是自动拆箱
	}
}

4 BigDecimal

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

4.1 创建对象

方式一 :
BigDecimal(double val)
将double转换为BigDecimal,后者是double的二进制浮点值十进制表示形式,有坑!
方式二 :
BigDecimal(String val)
将String类型字符串的形式转换为BigDecimal

4.2 常用方法

Add(BigDecimal bd) : 做加法运算
Subtract(BigDecimal bd) : 做减法运算
Multiply(BigDecimal bd) : 做乘法运算
Divide(BigDecimal bd) : 做除法运算,除不尽时会抛异常
Divide(BigDecimal bd,保留位数,舍入方式) : 除不尽时使用
setScale(保留位数,舍入方式) : 同上
pow(int n) : 求数据的几次幂

4.3 练习:测试常用方法

创建包: cn.tedu.bigdecimal
创建类: TestBigDecimal.java
需求: 接收用户输入的两个小数,做运算

package cn.tedu.bigdecimal;

import java.math.BigDecimal;
import java.util.Scanner;

/**本类用于测试浮点数运算时不精确的解决方案--BigDecimal*/
public class TestBigDecimal {
   
	public static void main(String[] args) {
   
		//method();//使用 + - * / 完成运算,暴露浮点数运算不精确的问题
		method2();//使用BigDecimal来解决浮点数运算不精确的现象
	}

	public static void method2() {
   //20:45接着继续,大家抓紧时间完成,一会我们进IO啦
		//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 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 add(BigDecimal bd) : 做除法运算
		/**java.lang.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);
	}

	public static void method() {
   
		//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 );//不精确
	}
}

到这里,API第一课就结束啦,恭喜你又闯过一关哦~

5 拓展

舍入方式解析
ROUND_HALF_UP 四舍五入,五入 如:4.4结果是4; 4.5结果是5
ROUND_HALF_DOWN 五舍六入,五不入 如:4.5结果是4; 4.6结果是5
ROUND_HALF_EVEN 公平舍入(银行常用)
比如:在5和6之间,靠近5就舍弃成5,靠近6就进位成6,如果是5.5,就找偶数,变成6
ROUND_UP 直接进位,不算0.1还是0.9,都进位
ROUND_DOWN 直接舍弃,不算0.1还是0.9,都舍弃
ROUND_CEILING(天花板) 向上取整,取实际值的大值
朝正无穷方向round 如果为正数,行为和round_up一样,如果为负数,行为和round_down一样
ROUND_FLOOR(地板) 向下取整,取实际值的小值
朝负无穷方向round 如果为正数,行为和round_down一样,如果为负数,行为和round_up一样


转载:https://blog.csdn.net/weixin_43884234/article/details/116865138
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场