Java笔记(13)常用类及正则
1.正则表达式
在开发中我们经常会对一些数据进行一些校验和检查,而Java也为我们提供了这个基本功能,正则表达式;根据给定的规则来匹配给定的数据;
对于正则表达式的详细规则,我们可以查阅API的Pattern类;
我这里列举一些常用的正则规则:
匹配字符:
x 字符x。举例:'a'表示字符a
\\ 反斜线字符。
\n 新行(换行)符 ('\u000A')
\r 回车符 ('\u000D')
匹配字符类:
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a到 z 或 A到 Z,两头的字母包括在内(范围)
[0-9] 0到9的字符都包括
预定义字符类
. 任何字符。我的就是.字符本身,怎么表示呢? \.
\d 数字:[0-9]
\w 单词字符:[a-zA-Z_0-9]
边界匹配器
^ 行的开头
$ 行的结尾
\b 单词边界
Greedy 数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
正则表达式常用的类:
Pattern类,是正则表达式的编译表示形式;
指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建 Matcher 对象,依照正则表达式,该对象可以与任意字符序列匹配。执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。
因此,典型的调用顺序是
Pattern p = Pattern.compile(“a * b”); //传递一个正则规则,得到匹配器对象
Matcher m = p.matcher(“aaaaab”);
boolean b = m.matches();
在仅使用一次正则表达式时,可以方便地通过此类定义 matches 方法。此方法编译表达式并在单个调用中将输入序列与其匹配。语句 boolean b = Pattern.matches(“a*b”, “aaaaab”);
这里面比较常用的是Matcher类的find()方法和group()方法,一个是查找是否存在满足匹配规则的数据,一个是获取刚才匹配到的数据,两个需结合使用,先判断找不找的到再获取;
最常用的还是String类带的正则表达式方法:
判断功能,判断当前字符串是否匹配正则
String类的public boolean matches(String regex);//regex是正则表达式
分割功能,返回所有匹配正则的子字符串数组
String类的public String[] split(String regex);
替换功能,替换匹配正则的子字符串
String类的public String replaceAll(String regex,String replacement)
下面列举几个正则表达式案例:
//判断电话号码,第一位必须是1,第二位1-8但不包含1、2、6,剩下9位任意0-9数字
String regex = "[1][1-8&&[^126]](\\d{9})";
//替换字符串里的数字为*
String regex = "\\d";
//匹配满足3个单词组成的字串
String regex = "\\b\\d{3}\\b";
2.Math类
Math类时Java针对数学运算操作的类,提供了很多的常用数学功能方法;
常见方法如下(详细参考API):
取绝对值:static double abs(double a) 返回 double 值的绝对值。
求立方根:static double cbrt(double a) 返回 double 值的立方根。
求最大值:static int max(int a, int b) 返回两个 int 值中较大的一个。
求某数的幂次值:static double pow(double a, double b) 返回第一个参数的第二个参数次幂的值。
随机数:static double random() 返回带正号的 double 值,该值大于等于 0.0 且小于 1.0。
平方根:static double sqrt(double a) 返回正确舍入的 double 值的正平方根。
四舍五入:static double ceil(double a) 返回最小的(最接近负无穷大)double 值,该值大于等于参数,并等于某个整数。
static double floor(double a) 返回最大的(最接近正无穷大)double 值,该值小于等于参数,并等于某个整数。
3.Random类
Random类是Java提供的用于产生一个伪随机数的类;
构造方法:
Random() 默认种子,每次产生的随机数不同
Random(long seed) 指定种子,每次种子相同,随机数就相同
不指定种子时,默认是当前系统时间的毫秒值;
主要成员方法:
int nextInt() 返回int范围内的随机数
int nextInt(int n) 返回[0,n)范围内的随机数
4.System类
System类提供了一些有用的字段和方法,它不能被实例化;
成员方法
public static void gc():运行垃圾回收器,执行System.gc()前,系统会自动调用finalize()方法清除对象占有的资源,通过super.finalize()方式可以实现从下到上的finalize()方法的调用,即先释放自己的资源,再去释放父类的资源。 但是,不要在程序中频繁的调用垃圾回收,因为每一次执行垃圾回收,JVM都会强制启动垃圾回收器运行,这会耗费更多的系统资源,会与正常的Java程序运行争抢资源,只有在执行大量的对象的释放,才调用垃圾回收器最好。
public static void exit(int status):终止当前正在运行的 Java 虚拟机。参数用作状态码;根据惯例,非 0 的状态码表示异常终止。
public static long currentTimeMillis():获取当前系统时间的毫秒值;
public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length):注意这个命名是不符合规范的。从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束,注意是替换而不是插入。
5.BigInteger类
是Java针对大整数的运算提供的一个类
构造方法: BigInteger(String s)
成员方法
A:加:BigInteger add(BigInteger val) 返回其值为 (this + val) 的 BigInteger。
B:减:BigInteger subtract(BigInteger val) 返回其值为 (this - val) 的 BigInteger。
C:乘: BigInteger multiply(BigInteger val) 返回其值为 (this * val) 的 BigInteger
D:除:BigInteger divide(BigInteger val) 返回其值为 (this / val) 的 BigInteger。
E:商和余数: BigInteger[] divideAndRemainder(BigInteger val) 返回包含 (this / val) 后跟 (this % val) 的两个 BigInteger 的数组。
6.BigDecimal
浮点数据做运算,会丢失精度。所以,针对浮点数据的操作建议采用BigDecimal。(金融相关的项目)
构造方法: BigDecimal(String s)
成员方法:
A:加:BigDecimal add(BigDecimal value);
B:减:BigDecimal subtract(BigDecimal subtrahend)
C:乘:BigDecimal multiply(BigDecimal value);
D:除:BigDecimal divide(BigDecimal value);
7.Date/DateFormat类
Date类是日期类,可以精确到毫秒值,常用来获取当前系统时间;
构造方法:
第一个构造函数使用当前日期和时间来初始化对象。
Date( )
第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。
Date(long millisec)
成员方法
返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。getTime()
用自1970年1月1日00:00:00 GMT以后time毫秒数设置时间和日期。
setTime(long time)
DateFormat针对日期进行格式化和针对字符串进行解析的类,但是是抽象类,所以使用其子类SimpleDateFormat
构造方法: SimpleDateFormat(String pattern)
给定模式:yyyy-MM-dd HH:mm:ss
其中 yyyy 是完整的公元年,MM 是月份,dd 是日期,HH:mm:ss 是时、分、秒。
日期和字符串的转换(DateFormat类下的方法)
a:Date – String
String format(Date date) 将一个 Date 格式化为日期/时间字符串。
b:String – Date
Date parse(String source) 从给定字符串的开始解析文本,以生成一个日期。
8.Calendar
日历类,封装了所有的日历字段值,通过统一的方法根据传入不同的日历字段可以获取值。
如何得到一个日历对象呢?
Calendar rightNow = Calendar.getInstance();
本质返回的是子类对象
成员方法
根据日历字段得到对应的值:int get(int field)
根据日历字段和一个正负数确定是添加还是减去对应日历字段的值:abstract void add(int field, int amount)
设置日历对象的年月日:void set(int year, int month, int date)