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);
}
}