一、 正则表达式
正则表达式(Regular Expression,简称 regex )是一种用于匹配和操作文本的强大工具,它是由一系列字符和特殊字符组成的模式,用于描述要匹配的文本模式。
正则表达式可以在文本中查找、替换、提取和验证特定的模式。
● 数字
public class RegularExpression2 {
public static void main(String[] args) {
String s = "";
//判断是否是 0~9 的数字且只出现一次
System.out.println(s.matches("[0-9]")); //false
String s1 = "1";
String s2 = "12";
System.out.println(s1.matches("[0-9]")); //true
System.out.println(s2.matches("[0-9]")); //false
//要是想匹配多次
// "*" 表示至少出现零次
System.out.println(s2.matches("[0-9]*")); //true
System.out.println(s.matches("[0-9]*")); //true
// "+" 表示一次到多次
System.out.println(s.matches("[0-9]+")); //false
// "?" 表示出现一次以下
System.out.println(s2.matches("[0-9]?")); //false
//{n}表示重复 n次
System.out.println(s2.matches("[0-9]{2}")); //true
System.out.println(s2.matches("[0-9]{1}")); //false
//{n.}表示重复 n次 或者 更多次
//{n,m}表示重复 n次 到 m次
//判断是否匹配字符串
String str = "1399";
String str1 = "2399";
System.out.println(str.matches("13[0-9]{2}")); //true
System.out.println(str1.matches("13[0-9]{2}")); //false
//匹配特殊数字
System.out.println(str.matches("[139]*")); //只允许出现1或3或9
System.out.println(str1.matches("[139]*")); //false
}
}
● 字母
/*
字母匹配
*/
public class RegularExpression4 {
public static void main(String[] args) {
String s = "abcd";
String S = "ABCD";
String str = "aBcD";
//小写
System.out.println(s.matches("[a-z]*"));;
//大写
System.out.println(S.matches("[A-Z]*"));
//大小写
System.out.println(str.matches("[a-zA-Z]*"));
System.out.println(str.matches("[A-z]*"));;
//大小写字母和数字和下划线
System.out.println(str.matches("[A-z0-9]*"));
System.out.println(str.matches("\\w*"));
//匹配中文字符
String str1 = "张三";
System.out.println(str1.matches("[\\u4e00-\\u9fa5]*"));
}
}
● 测试
public class Test {
public static void main(String[] args) {
//验证一个字符串是否是中国大陆手机号?(+86)
String s = "13999999999";
/*
长度:11位
是否是1开头
第二位不是2
之后判断每一位是否是数字
*/
//定义一个规则
boolean bl = s.matches("1[357]\\d{9}");
if(bl){
System.out.println(s+" 是中国大陆手机号");
} else{
System.out.println("不是");
}
bl = s.matches("0?(13|14|15|17|18)[0-9]{9}");
System.out.println(bl);
//验证一个是否是邮箱
//\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}
/*
注: "|"在正则表达式中是或的运算符
一般:xxxxx@xx.com com.cn
*/
String s2 = "123455@qq.com";
boolean Email;
Email = s2.matches("\\w{6,10}@[0-9A-z]{2,5}.(com|com.cn)");
System.out.println(Email);
//但是,"."也是一个特殊符号---匹配除换行符以外的任意字符
String s3 = "123456@qqqcom";
System.out.println(s3.matches("\\w{6,10}@[0-9A-z]{2,5}.(com|com.cn)"));
//同样也会是true,因此也要加转义字符
System.out.println(s3.matches("\\w{6,10}@[A-z]{2,5}\\.(com|com\\.cn)"));
}
}
二、 Math类
java.lang.Math 提供了一系列 静态方法 用于科学计算;其方法的参数和返回值类型一般为double型。
abs 绝对值
sqrt 平方根
pow(double a, double b) a的b次幂
max(double a, double b)
min(double a, double b)
random() 返回 0.0 到 1.0 的随机数
long round(double a) double型的数据a转换为long型(四舍五入)
public class Math1 {
public static void main(String[] args) {
//π的值
System.out.println("PI = " + Math.PI); //PI = 3.14159265358979323846;
//求绝对值
System.out.println(Math.abs(-3));
//开平方
System.out.println(Math.sqrt(9));
//求a的b次幂
System.out.println(Math.pow(2,3)); //8
//取近似值
//向下取整
System.out.println(Math.floor(9.9)); //9.0
//向上取整
System.out.println(Math.ceil(9.1)); //10.0
//四舍五入
System.out.println(Math.round(9.3)); //9.0
System.out.println(Math.round(9.5)); //10.0
//比大小
System.out.println(Math.max(10,5)); //10
//返回一个 0~1 之间的随机数(可能会等于0,但只会小于1)
System.out.println(Math.random());
}
}
三、 Random类
Random类,用于产生 随机数
System.out.println(random.nextInt(5)); //有范围(0~bound)的生成
● 构造方法
public Random ()
● 成员方法
public int nextInt ()
public int nextInt (int n)
import java.util.Arrays;
import java.util.Random;
public class RandomDemo {
public static void main(String[] args) {
Random random = new Random();
//生成随机boolean值
System.out.println(random.nextBoolean());
//随机整数
System.out.println(random.nextInt());//int范围
System.out.println(random.nextLong());//long范围
System.out.println(random.nextInt(5));//有范围 [0~bound) 的生成
//生成一个随机数组
byte[] bytes = new byte[5];
random.nextBytes(bytes);
System.out.println(Arrays.toString(bytes));
/*
int[] ints = new int[5];
random.nextBytes(ints);
但是只能生成 byte 类型的数
*/
}
}
四、 Date类
使用Data类代表当前系统时间
● 构造方法
Date d = new Date();
Date d = new Date(long d);
import java.util.Date;
public class DataDemo {
public static void main(String[] args) {
//在系统中获取当前系统时间
//无参的
Date date = new Date(); //运行到这一行时那一刻的时间
System.out.println(date); //以toString输出
//单另拿出某一个时间类型
System.out.println(date.getYear()+1900);
System.out.println(date.getMonth()+1);
System.out.println(date.getDate());
System.out.println(date.getHours());
System.out.println(date.getMinutes());
System.out.println(date.getSeconds());
/*
方法上有删除键,表示该方法以弃用
有更好的方法来替代
但原方法仍可以使用
*/
//获取的是自1970年1月1日0时0分0秒至程序运行时刻的毫秒值
// 1 ms = 0.001 s
System.out.println(date.getTime());
}
}
● 计算程序运行时间
import java.util.Date;
public class DataDemo {
public static void main(String[] args) {
//获取的是自1970年1月1日0时0分0秒至程序运行时刻的毫秒值
// 1 ms = 0.001 s
System.out.println(date.getTime());
Date d1 = new Date();
System.out.println("d1:"+d1.getTime());
int sum = 0;
for(int i = 0;i<1000;i++){
sum+=i;
}
Date d2 = new Date();
System.out.println("d2:"+d2.getTime());
System.out.println(d2.getTime()-d1.getTime());
/*
有参的
*/
Date date1 = new Date(1709811745721L); //默认为int,所以要加L转型
System.out.println(date1);
}
}
五、 Calendar类
Calendar类是一个抽象类,在实际使用时实现特定的子类的对象,创建对象的过程对程序员来说是透明的,只需要使用 getInstance 方法创建即可。
Calendar c1 = Calendar.getInstance();
c1.get(Calendar. YEAR);
import java.util.Calendar;
public class CalendarDemo {
public static void main(String[] args) {
//因为Calendar是一个抽象类,所以使用的时要使用他的子类
Calendar calendar = Calendar.getInstance();
System.out.println(calendar); //公历(格里高利日历)
//传入一个日历字段
System.out.println(calendar.get(Calendar.YEAR));
System.out.println(calendar.get(Calendar.MARCH));
System.out.println(calendar.get(Calendar.DAY_OF_MONTH));
System.out.println(calendar.get(Calendar.DAY_OF_WEEK));
System.out.println(calendar.get(Calendar.HOUR_OF_DAY));
System.out.println(calendar.get(Calendar.MINUTE));
System.out.println(calendar.get(Calendar.SECOND));
System.out.println();
//同样的,获取从1970.1.1 0时0分0秒到现在的毫秒时
System.out.println(calendar.getTimeInMillis());
System.out.println();
//也可以设定一个时间
calendar.set(2024,3,1);
System.out.println(calendar.get(Calendar.YEAR));
System.out.println(calendar.get(Calendar.MONTH));
System.out.println(calendar.get(Calendar.DAY_OF_MONTH));
}
}
六、 SimpleDateFormat类
SimpleDateFormat :日期格式化类
● 构造方法
SimpleDateFormat(格式); // yyyy-MM-dd
● 日期转字符串
Date now=new Date();
myFmt.format(now);
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatDemo {
//抛出错误,不管
public static void main(String[] args) throws ParseException {
String s = "2024-03-01";
/*
把字符串日期转为日期对象
*/
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); //需要传入一个格式
Date date = sdf.parse(s); //返回一个date类型的对象
System.out.println(date.getYear()+1900);
System.out.println(date.getMonth()+1);
System.out.println(date.getDate());
System.out.println(date);
}
}
● 字符串转日期
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatDemo {
//抛出错误,不管
public static void main(String[] args) throws ParseException {
/*
把日期对象转化为指定格式的字符串
*/
Date date1 = new Date(); //时间以后端时间为准
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String s1 = sdf1.format(date1);
System.out.println(s1);
}
}
七、 BigInteger
在 Java 中,有许多数字处理的类,比如 Integer类,但是Integer类有一定的局限性。
我们都知道 Integer 是 Int 的包装类,int 的最大值为 2^31-1 。若希望描述更大的整数数据时,使用Integer 数据类型就无法实现了,所以Java中提供了BigInteger 类。
● BigInteger类型的数字范围较Integer,Long类型的数字范围要大得多,它支持任意精度的整数,也就是说在运算中 BigInteger 类型可以准确地表示任何大小的整数值而不会丢失任何信息。
● BigInteger类位于java.math包中
● 构造方法
BigInteger(String val) /BigInteger(byte[] val) ...
● 基本运算方法
add(),加
subtract(),减
multiply(),乘
divide(),除
import java.math.BigInteger;
public class BigIntegerDemo {
public static void main(String[] args) {
BigInteger bigInteger = new BigInteger("1111111111111111111111111111111111111111111111111111111111111111111111111111");
BigInteger bigInteger1 = new BigInteger("9999999999999999999999999999999999999999999999999999999999999999999999999999");
System.out.println(bigInteger);
System.out.println(bigInteger1);
//加 add()
System.out.println(bigInteger.add(bigInteger1));
//减 subtract()
System.out.println(bigInteger1.subtract(bigInteger));
//乘 multioly()
System.out.println(bigInteger.multiply(bigInteger1));
//除 divide()
System.out.println(bigInteger1.divide(bigInteger));
}
}
八、 BigDecimal
在计算机中, float 还是 double都是浮点数,而计算机是二进制的,浮点数会失去一定的精确度。根本原因在于:十进制浮点值没有完全相同的二进制表示形式;十进制浮点值的二进制表示形式不精确,只能无限接近于那个值。
System.out.println((0.1 + 0.2)==0.3); //结果是?
但是,在项目中,我们不可能让这种情况出现,特别是金融项目,因为涉及金额的计算都必须十分精确,你想想,如果你的支付宝账户余额显示 193.99999999999998 ,那是一种怎么样的体验?
因此,Java在java.math包中提供了 BigDecimal 类
● 构造方法
BigDecimal(String val)
● 基本运算方法
add(),加
subtract(),减
multiply(),乘
divide(),除 // 除法时,如果遇到无法除尽的,需要给定保留的小数位,并选定舍入模式
import javax.xml.transform.Source;
import java.math.BigDecimal;
public class BigDecimalDemo {
public static void main(String[] args) {
System.out.println((0.1 + 0.2) == 0.3);//false
System.out.println((0.3+0.36));
BigDecimal bigDecimal1 = new BigDecimal("0.1");
BigDecimal bigDecimal2 = new BigDecimal("0.2");
BigDecimal bigDecimal3 = new BigDecimal("0.3");
BigDecimal bigDecimal4 = new BigDecimal("0.36");
System.out.println(bigDecimal1.add(bigDecimal2));
System.out.println(bigDecimal3.add(bigDecimal4));
/*
注:除
当除法除不尽时,需要给定保留的小数位数,以及舍入模式
*/
BigDecimal b1 = new BigDecimal("10");
BigDecimal b2 = new BigDecimal("3");
System.out.println(b1.divide(b2,2,1)); //最后一位舍弃
System.out.println(b1.divide(b2,2,2)); //最后一位进位
// 保留2位 模式2
}
}