正则表达式Regex
-
概述:
正确的字符串格式规则。常用来判断用户输入的内容是否符合格式的要求,注意是严格区分大小写的。
-
常用语法
-
String 提供了支持正则表达式的方法
- matches(正则) : 当前字符串能否匹配正则表达式
- replaceAll(正则,子串):替换子串
- split(正则) : 拆分字符串
-
案例
//需求:接受用户输入的身份证号,将判断的结果输出 public class TestRegex{ public static void main(String[] args){ //1.编辑正则表达式 //身份证号规律:一共18位 前17位数字,第18位有可能数字 有可能是X String regex = "[0-9]{17}[0-9X]"//创建regex正则规则 作为判定标准 /*单个\在java中有特殊含义 表示转义符号 不认为是一个单纯的斜杠 * 所以 如果想要表示斜杠 需要在它的前边加一个用来转义的\ * 也就是\\才表示一个单纯的斜杠 * \t 制表符 \r回车符 \n换行符*/ //String regex = "\\d{17}[0-9X]"; //2.提醒用户输入身份证号 System.out.println("请输入身份证号") String input = new Scanner(System.in).nextLine(); //3.判断用户输入的身份证号是否符合要求 if(input.matches(regex)){//判断语句用对象调用matches(regex) System.out.println("恭喜您!身份证号输入正确") }else{ System.out.println("您输入的身份信息有误,请输入正确的身份证号") } } }
-
包装类
-
概念:
把基本类型进行包装,提供更加为完善的功能.
基本类型是没有任何功能的,只是一个变量,记录值,而包装类可以有更加丰富的功能
-
与基本类型的对应关系:
-
测试包装类:-------int类型包装类Integer double类型包装类Double
-
创建对象的方式:
-
包装类名 对象名 = new 包装类名(参数值);------方法一
-
包装类名 对象名 =包装类名.valueOf(参数值)-----方法二
-
-
常用方法:
-
parseInt()----将String类型数据转换为int类型
System.out.println(Integer.parseInt(“800”)+8);//808
-
parseDouble()----将String类型数据转换为double类型
System.out.println(Double.parseDouble(“2.2”)+1.1);//3.3
-
public class TestNumber{ //创建成员变量 包装类Interger static Interger i0; public static void main(String[] args){ /*1.包装类型是引用类型,存在默认值null*/ System.out.println(i0);//null //创建int类型对应的包装类型Integer的对象---方式1 Integer i1 = new Integer(5); Integer i11 = new Integer(5); System.out.println(i1==i11);//false Integer是引用类型 ==比较的是地址值 //创建int类型对应的包装类型Integer的对象---方式2 Integer i2 = Integer.valueOf(127); Integer i3 = Integer.valueOf(127); /*2.Integer有一个高效的效果,------使用valueOf()创建对象 *并且数据在-128~127之间,相同的数据只会存一次 *后续再存只是使用之前存过的数据*/ System.out.println(i2==i3);//true /*3.满足高效的三个条件: Integer valueOf() -128~127*/ Integer i4 = Integer.valueOf(300); Integer i5 = Integer.valueOf(300); System.out.println(i4==i5);//false //创建double类型的包装类型Double的对象---方式1 Double d1=new Double(3.14); Double d2=new Double(3.14); System.out.println(d1==d2);//false,引用类型 比较地址值 //创建double类型对应的包装类型Double的对象---方法2 /*Double没有高效效果*/ Double d3 = Double.valueOf(3.14); Double d33 = Double.valueOf(3.14); System.out.println(d1==d3);//false System.out.println(d3==d33);//false //测试常用方法 //parseInt():将String类型数据转换为int类型 System.out.println(Integer.parseInt("800")+8);//808 //parseDouble():将String类型数据转换为double类型 System.out.println(Double.parseDouble("2.2")+1.1);//3.3 } }
-
自动装箱和自动拆箱
-
概念:
-
自动装箱: 把 基本类型 包装成对应的 包装类型 的过程 【基本类型 到 包装类型】
- 自动装箱时,底层发生的代码: 包装类.valueOf(参数值)
-
自动拆箱: 从包装类型的值,自动变成 基本类型的值 【包装类型 到 基本类型】
- 自动拆箱时,底层发生的代码: 对象名.要转换的类型Value();
//创建Integer包装类的两种方式 Integer i1 = new Integer(127); Integer i2 = Integer.valueOf(127) //现在的创建方式: 自动装箱 Integer i3 = 127; /*1.自动装箱:编译器会自动把基本类型int 5,包装成包装类型Integer * 然后交给引用类型的变量i3来保存,自动装箱时底层发生的代码:Integer.valueOf(5) * valueOf()的方向:int --> Integer*/ //自动拆箱: int i4 = i1; /*2.自动拆箱:编译器会自动把包装类型的i1拆掉"箱子",变回基本类型的数据127 * 然后把这个值交给int类型的变量i4来保存,自动拆箱时底层发生的代码:i1.intValue(); * intValue()的方向:Integer --> int*/
-
BigDecimal
-
作用: 常用来解决浮点数运算不精确的问题
-
创建对象:
-
BigDecimal(double val)
将double类型的数据作为参数,交给BigDecimal对象【不用,因为double本身不精确】
-
BigDecimal(String val)
将String类型的数据作为参数,交给BigDecimal对象【用这个】
-
注意: double数据 转为 String数据 直接拼接一个空串 “” 即可
-
-
使用对象进行加减乘除操作
注意: 进行除法操作时,会出现除不尽的情况 抛出算数异常 这时候需要指定保留几位小数以及舍入方式
//1.创建对象----不用 BigDecimal bd1 = new BigDecimal(double val) BigDecimal bd2 = new BigDecimal(double val) //2.创建对象----用 BigDecimal bd3 = new BigDecimal(double val+"") BigDecimal bd4 = new BigDecimal(double val+"") //3.加减乘除 需要定义一个新的变量来保存结果 BigDecimal bd5; bd5 = bd3.add(bd4);//加 bd5 = bd3.subtract(bd4);//减 bd5 = bd3.multiply(bd4);//乘 bd5 = bd3.divide(bd4);//除----------出现除不尽时,会报错 /*解决除法报错--------使用重载的divide(m,n,o) * m是要除以那个对象 * n是除不尽时保留的位数 * o是舍入方式,常用的是四舍五入 可以用BigDecimal直接点出来*/ bd5 = bd3.divide(bd4,3,BigDecimal.ROUND_HALF_UP);//除以bd4 保留3位小数 四舍五入
File 文件类
-
创建File类的对象:
new File(String pathname) :这个参数是一个String类型的路径名,这个路径可能是:
1)文件的路径 “D:\ready\1.txt”
2)文件夹的路径 “D:\ready\a”
3)之前不存在的文件/文件夹的路径:这个路径暂时在windows中还未创建出来
注意:new File类的对象只是在内存中多个一个Java对象,并不会真的帮我们在外部创建一个新的文件/文件夹
//1.创建File类对象
/*1.File需要导包:import java.io.File
* 2.路径是String类型,必须写正确,不然找不到文件
* 3.完整的文件名包含两部分:文件名+后缀名
* 4.ready文件夹 和 1.txt文件 需要自己手动创建*/
File file = new File("D:\\ready\\1.txt");
//2.测试常用方法
System.out.println(file.length());//3 获取当前文件的字节量
System.out.println(file.exists());// true 判断文件是否存在
System.out.println(file.isFile());//true 判断当前file对象是文件吗
System.out.println(file.isDirectory());//false 判断当前file对象是文件夹吗
System.out.println(file.getName());//1.txt 获取当前file对象的完整的文件名
System.out.println(file.getParent());//D:\ready 获取当前file对象的父级路径
System.out.println(file.getAbsolutePath());//D:\ready\1.txt 获取当前file对象的 带盘符的文件的绝对路径
//3.测试创建 与 删除
/*new只会帮你在内存中创建一个File类型的对象
* 并不会帮你在磁盘中创建一个真实存在的2.txt*/
File file2 = new File("D:\\ready\\2.txt" );
//创建一个之前不存在的2.txt 如果创建成功 会返回true
/*如果指定创建文件的路径不对 会抛出异常
* 所以我们需要提前处理这个问题,暂时选择在main()上抛出
* 这个IO异常是目前我们遇见的强制要求必须预先处理的异常
* 如果不处理,方法的调用会报错,通不过编译*/
System.out.println(file2.createNewFile());//创建不存在的文件
File file3 = new File("D:\\ready\\m");
System.out.println(file3.mkdir());//创建不存在的单层文件夹
File file4 = new File("D:\\ready\\a\\b\\c");
System.out.println(file4.mkdirs());//创建不存在的多层文件夹
/*delete()只能删除文件和空文件夹*/
file2.delete(); //删除文件2.txt
file4.delete(); //删除空文件夹c delete删除文件夹时只能删除空文件夹
file3.delete(); //删除空的m文件夹
//4.测试展现文件列表
File file5 = new File("D:\\ready");
String[] list = file5.list();/*不常用*/
System.out.println(Arrays.toString(list));//[1.txt,a]
//System.out.println(list[0].getName()); // 会报错 因为list这是一个String[],数组中每个元素都是String类型的
//那么我们只能使用String类中的方法,getName()是File类的方法,在这里不能用
File[] fs = file5.listFiles();/*常用*/
System.out.println(Arrays.toString(fs));//[D:\ready\1.txt, D:\ready\a]
System.out.println(fs[0].getName());//fs是file对象 可以直接使用file方法