Math、Random、System、BigInteger、Date、DateFormat、Calendar类,正则表达式_DAY14
1:Math&大数据类四则运算
X abs(X x)
double random() 产生随机数
double ceil(double a) 向上取整
double floor(double a) 向下取整
X max/min(X x,X y)
double pow(double a, double b) 返回a的b次方
round(double a) 四舍五入,即该值加上0.5,然后去floor
例子:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/* * Math: * 静态常量: * 1:Math.E : 自然对数的底数 Math.PI: 圆周率 * 主要方法: * 2:public static double abs(int c) 取绝对值 * 3:public static double ceil(double a) 向上取整 * public static double floor(double a) 向下取整 * 4:public static double max(double a,double b) 取最大值 * public static double min(double a,double b) 取最小值 * 5:public static double pow(double a, double b) 返回第一个参数的第二个参数次幂的值。 * 6:public static double random() [0,1) * 7:public static long round(double a) 四舍五入 */ public class Demo { public static void main(String[] args) { //1 System.out.println(Math.E); System.out.println(Math.PI); //2获取绝对值 int a = -10; System.out.println(Math.abs(a)); byte b = 10; System.out.println(Math.abs(b)); //3 System.out.println(Math.ceil(1.1)); System.out.println(Math.ceil(1.8)); System.out.println(Math.ceil(-1.1)); System.out.println(Math.ceil(-1.8)); System.out.println(Math.floor(1.1)); System.out.println(Math.floor(1.8)); System.out.println(Math.floor(-1.1)); System.out.println(Math.floor(-1.8)); //4 System.out.println(Math.max(10, 20)); System.out.println(Math.min(10, 20)); //5 System.out.println(Math.pow(10, 3)); //6 System.out.println(Math.random()); //7 System.out.println(Math.round(1.1)); System.out.println(Math.round(1.8)); System.out.println(Math.round(-1.1)); System.out.println(Math.round(-1.8)); } }
注释:产生随机数的random实际调用的是Random类随机数,方法如下:
public static double random() {
Random rnd = randomNumberGenerator;
if (rnd == null) rnd = initRNG();
return rnd.nextDouble();
}
2:Random
(1)是产生伪随机数的类。
(2)构造方法:
A:Random r = new Random(); //每次调用该对象时,默认产生不同的种子
B:random r = new Random(long seed);
注意:种子一样,随机数一样。
例子:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import java.util.Random; /* * Random类:伪随机数生成类 * 构造方法: * 1:public Random() 使用一个任意的不重复的数作为种子生成对象 * 2:public Random(long seed) 使用一个指定的数作为种子生成对象 * * 主要方法: * 3:public int nextInt() 及其重载,根据不同类型生成随机数, * 4:public int nextInt(int n) 产生[0,n)之间的随机数 */ public class Demo2 { public static void main(String[] args) { //1 Random random = new Random(); for (int i = 0; i < 10; i++) { System.out.println(random.nextInt()); //空参构造器每次产生的种子不一样,产生的随机数不一样 } System.out.println("=============================="); Random random2 = new Random(); for (int i = 0; i < 10; i++) { System.out.println(random2.nextInt()); //空参构造器每次产生的种子不一样,产生的随机数不一样 } //2 System.out.println("=============================="); Random random3 = new Random(1l); //种子一样,产生的随机数也一样 for (int i = 0; i < 10; i++) { System.out.println(random3.nextInt()); } System.out.println("=============================="); //种子一样,产生的随机数也一样 Random random4 = new Random(1l); for (int i = 0; i < 10; i++) { System.out.println(random4.nextInt()); } System.out.println("=============================="); //3 Random random5 = new Random(); for (int i = 0; i < 100; i++) { System.out.println(random5.nextInt(100)); //产生[0,100)之间的随机整数 } } }
(3)掌握的方法:
public int nextInt(int n):产生在[0,n)之间的随机数。
3:System(掌握)
(1)系统类,通过了静态的方法供我们使用。
(2)要掌握的功能:
A:exit(int i) //退出VM 终止当前正在运行的 Java 虚拟机,i=0,便是正常退出,i!=0,表示异常退出。
B:currentTimeMillis() //获取当前毫秒值 可以用来测算程序运行的时间
long l1=System.currentTimeMillis();
//code...
long l2=System.currentTimeMillis();
System.out.println(l2-l1); //输出中间代码运行时间
C:arraycopy() //arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束
D:public static Properties getProperties() 获取系统属性值
例子:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/* * System类:系统类 * 主要方法: * 1:public static void gc() 运行垃圾回收器。 * 2:public static void exit(int status) 终止当前正在运行的 Java 虚拟机。 * 3:public static long currentTimeMillis() 获取当前时间毫秒值,根据协调世界时间。可以用来检测程序运行时间 * 4:public static Properties getProperties() 确定当前的系统属性。 */ public class Demo3 { public static void main(String[] args) { //3:获取当前时间毫秒值 System.out.println(System.currentTimeMillis()); //4:获取系统属性 System.out.println(System.getProperties()); //2: System.out.println("i love java!"); System.exit(0); System.out.println("i hate java!"); } }
gc():调用 gc()方法暗示着 Java 虚拟机做了一些努力来回收未用对象
finalize():当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。子类重写 finalize 方法,以配置系统资源或执行其他清除。
4:BigInteger类和Bigdecimal类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import java.math.BigInteger; import java.util.Arrays; /* * BigInteger:支持任意精度的整数 * 方法: * public BigInteger add(BigInteger val) 加法 * public BigInteger subtract(BigInteger val) 减法 * public BigInteger multiply(BigInteger val) 乘法 * public BigInteger divide(BigInteger val) 除法 * public BigInteger[] divideAndRemainder(BigInteger val) * 构造器: * BigInteger(String val) //将 BigInteger 的十进制字符串表示形式转换为 BigInteger。 */ /* * BigDecimal:支持任意精度的小数 * 方法: * public BigDecimal add(BigDecimal augend) 加法 * public BigDecimal subtract(BigDecimal subtrahend) 减法 * public BigDecimal multiply(BigDecimal multiplicand) 乘法 * public BigDecimal divide(BigDecimal divisor) 除法 * public BigDecimal[] divideAndRemainder(BigDecimal divisor) //返回商和余数 * 构造器: * BigDecimal(String val) //将BigDecimal 的字符串表示形式转换为 BigDecimal。 public class Demo4 { public static void main(String[] args) { BigInteger bi = new BigInteger("11111111111"); // 将 BigInteger 的十进制字符串表示形式转换为 BigInteger BigInteger bi2 = new BigInteger("2"); System.out.println(bi.add(bi2)); System.out.println(bi.subtract(bi2)); System.out.println(bi.multiply(bi2)); System.out.println(bi.divide(bi2)); System.out.println(Arrays.toString(bi.divideAndRemainder(bi2))); System.out.println(4099.99-969.01);//3130.9799999999996 BigDecimal b1=new BigDecimal(4099.99); BigDecimal b2=new BigDecimal(969.01); //误差减小了一点点 System.out.println(b1.subtract(b2));//3130.979999999999790816218592226505279541015625 } }
5:日期(理解)
(1)Date:
表示一个日期类。大部分方法过时,被Calendar替代。
构造方法:
Date d = new Date();
Date d = new Date(long time);
获取毫秒值:
public long getTime()// 获取毫秒数
public void setTime(long time) //设置毫秒数
例子:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import java.util.Date; /* * Date类: * 类 Date 表示特定的瞬间,精确到毫秒。就是表示时间的。 * 构造方法: * 1:public Date()分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒), 获取当前时间 * 2:public Date(long date) 根据毫秒值,创建日期对象。 * 主要方法: * 3:public long getTime() 获取毫秒数 * 4:public void setTime(long time) 设置毫秒数 */ public class Demo5 { public static void main(String[] args) { //获取当前时间 Date date = new Date(); System.out.println(date); Date date3 = new Date(System.currentTimeMillis()); System.out.println(date3); //2 Date date2 = new Date(1645645766712l); System.out.println(date2); //3,4 System.out.println("========================="); Date date4 = new Date(); long time = date4.getTime(); System.out.println(time); date4.setTime(1234566788l); System.out.println(date4); } }
(2)DateFormat:
对日期进行格式化和对字符串解析的类
String -- Date:
解析:par se(转换的意思)
//将一个字符串日期,转成一个date日期>>>经常做的
String date = "2014年09月25日 12时24分15";
DateFormat dateFormat2 = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss");
Date parse = dateFormat2.parse(date);
System.out.println(parse);
Date -- String:
格式化:format(“要符合的日期格式”)
DateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");//格式 yyyy年MM月dd日 HH时mm分ss秒
String format = dateFormat.format(new Date());
System.out.println(format);
例子:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; /* * 日期格式化类: * DateFormat:是日期/时间格式化子类的抽象类 * public final String format(Date date) 将一个 Date 格式化为日期/时间字符串。 * public Date parse(String source) 将字符串转成Date对象 * SimpleDateFormat:具体的时间格式化工具 * 构造: * public SimpleDateFormat() 空参构造,使用默认格式 * public SimpleDateFormat(String pattern) 根据指定模式创建日期格式化类对象 */ public class Demo6 { public static void main(String[] args) throws ParseException { //日期对象转字符串 Date date = new Date(); //创建要被格式化的日期对象 System.out.println(date); SimpleDateFormat sdf = new SimpleDateFormat(); //使用默认的格式创建日期格式化对象 String format = sdf.format(date); //调用日期格式化对象的方法格式化日期 System.out.println(format); //打印格式化好的字符串日期 System.out.println("=================="); Date date2 = new Date(); //创建要被格式化的日期对象 String model = "yyyy年MM月dd日 HH:mm:ss"; //定义日期表示模式(格式) SimpleDateFormat sdf2 = new SimpleDateFormat(model); //使用指定的格式创建日期格式化对象 String format2 = sdf2.format(date2); //调用日期格式化对象的方法格式化日期 System.out.println(format2); //打印格式化好的字符串日期 System.out.println("==================="); //字符串转日期对象 String sDate = "2015-04-04 11:48:43"; //定义字符串类型的日期 String model2 = "yyyy-MM-dd HH:mm:ss"; //定义日期表示模式(格式) SimpleDateFormat sdf3 = new SimpleDateFormat(model2);//使用指定的格式创建日期格式化对象 Date parseDate = sdf3.parse(sDate); //调用日期格式化对象的方法将日期按照指定的格式转成Date对象 System.out.println(parseDate); //打印Date对象 } }
(3)Calendar:
日历类,对日期进行了更细的划分,可以获取日历的每个字段值。
根据日历字段获取对应的值:
get(Calendar.相应字段)
设置年月日:
一般情况下,都是由getInstance()获取Calendar对象
在特殊业务需求时,需要进行判断
set(int year,int month,int date)
返回一个Date类型的对象
getTime()
修改指定日历的值:
add(int field,int value) //此处的field要用Calendar来调用,如Calendar.YEAR
例子:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import java.util.Calendar; /* * Calendar:日历类对象 * * 创建对象:1:Calendar rightNow = Calendar.getInstance(); * * 主要方法: * 2:public int get(int field) 通过指定的字段(key),获取对应的值 * 注意:月份是0-11 其余字段正常 * 3:public abstract void add(int field,int amount) 给指定的字段值添加指定的量 * 4:public final void set(int year, int month, int date) 给指定的字段赋值,但是是直接给值 * public final Date getTime() 将日历对象转成Date对象 */ public class Demo7 { public static void main(String[] args) { //1 Calendar rightNow = Calendar.getInstance();//生成的是Calemdar类的子类GregorianCalendar的对象 System.out.println(rightNow); //2 int year = rightNow.get(Calendar.YEAR); System.out.println(year); //3:public abstract void add(int field,int amount) rightNow.add(Calendar.YEAR, 1); System.out.println(rightNow.get(Calendar.YEAR)); // 计算机中2016.3.4 现实生活中 2016.4.4 rightNow.add(Calendar.MONTH, 1); System.out.println(rightNow.get(Calendar.MONTH));// 计算机中2016.4.4 现实生活中 2016.5.4 rightNow.add(Calendar.DAY_OF_MONTH, -10); // 计算机中2016.3.24 现实生活 2016.4.24 System.out.println(rightNow.get(Calendar.MONTH)); System.out.println(rightNow.get(Calendar.DAY_OF_MONTH)); //4:public final void set(int year, int month, int date)//设置日期,并且以Data类型对象输出 Calendar rightNow2 = Calendar.getInstance(); rightNow2.set(2015, 0,1); System.out.println(rightNow2.getTime()); } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /* * 请计算伟大祖国多少天了? */ public class Test { public static void main(String[] args) throws ParseException { //得到现在时间的毫秒值 long rightNow = new Date().getTime(); //得到建国时间的毫秒值 // 方法1: // String sBirthday = "1949-10-01"; // String model = "yyyy-MM-dd"; // DateFormat df = new SimpleDateFormat(model); // Date dBirthday = df.parse(sBirthday); // 方法2 Calendar cBirthday = Calendar.getInstance(); cBirthday.set(1949, 10, 1); Date dBirthday = cBirthday.getTime(); //Calendar的getTime 返回Date对象 long lBirthday = dBirthday.getTime(); //Date的getTime 返回Long类型的毫秒值 //根据毫秒值计算天数 long time = rightNow-lBirthday; int days = (int)(time/1000/60/60/24); System.out.println(days); } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import java.util.Calendar; /* * 如何获得任意年份二月有多少天? */ public class Test2 { public static void main(String[] args) { int fdays = getFdays(2004); System.out.println(fdays); } public static int getFdays(int year) { Calendar calendar = Calendar.getInstance(); calendar.set(year, 2, 1); calendar.add(Calendar.DAY_OF_MONTH, -1); return calendar.get(Calendar.DAY_OF_MONTH); } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import java.util.Calendar; /* * 获取昨天的此时此刻 */ public class Test3 { public static void main(String[] args) { Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.DAY_OF_MONTH, -1); System.out.println(calendar.getTime()); } }
6:正则表达式(掌握用法)
(1)符合一定规则的字符串。
(2)规则:
A:字符
x 字符 x
\\ 反斜线字符
\r 回车符
\n 换行符
B:字符类
[abc] a、b 或 c
[^abc] 任何字符,除了 a、b 或 c
[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内
[0-9] 包括0-9之间的字符
C:预定义字符类
. 任何字符
\d 数字:[0-9]
\w 单词字符:[a-zA-Z_0-9]
D:边界匹配器
^ 行的开头
$ 行的结尾
\b 单词边界
就是指这里出现的不能使单词字符。
he;wor xixi
E:Greedy 数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
F:组的概念(按照小括号从左开始编号,每一个对应着一个组)
(a(b(c)d(e)))
第一组:a(b(c)d(e))
第二组:b(c)d(e)
第三组:c
第四组:e
将来我们就可以通过编号来获取组中内容。组0表示整个表达式。
(3)通过String类的功能使用正则表达式
A:判断功能
public boolean matches(String regex)
B:分割功能
public String[] split(String regex)
C:替换功能
public String replaceAll(String regex,String newString)
记住:
叠次:
在同一个字符串中,右边引用左边:"(.)\\1+"
在后一个字符串中引用前面的字符串的组内容:"(.)\\1+","$1"
例子:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import java.util.Arrays; /* * 正则表达式: * 字符串结合正则的使用 * 1:public boolean matches(String regex) 告知此字符串是否匹配给定的正则表达式。 * 2:public String[] split(String regex) 按照指定规则切割字符串,生成对应字符串数组 * 3:public String replaceAll(String regex, String 替换的字符串) */ public class Demo2 { public static void main(String[] args) { //1: //定义被匹配的字符串 String s = "qxq"; String s2 = "qeq"; //定义正则规则 String regex = "q[aeiou]q"; boolean matches = s.matches(regex); System.out.println(matches); boolean matches2 = s2.matches(regex); System.out.println(matches2); //2: /* 切割字符串"aa,bb,cc" 切割字符串"aa.bb.cc" 切割字符串"-1 99 4 23" 切割字符串"-1 99 4 23" */ //定义被匹配的字符串 String s3 = "aa,bb,cc"; String regex2 = ","; String[] split = s3.split(regex2); // System.out.println(Arrays.toString(split)); for (int i = 0; i < split.length; i++) { String string = split[i]; System.out.print(string+" "); } System.out.println("=========================="); String s4 = "aa.bb.cc"; String regex3 = "\\."; // .需要转义,\也需要转义 String[] split2 = s4.split(regex3); System.out.println(Arrays.toString(split2)); System.out.println("=========================="); String s5 = "-1 99 4 23"; String regex4 = " "; String[] split3 = s5.split(regex4); System.out.println(Arrays.toString(split3)); System.out.println("=========================="); String s6 = "-1 99 4 23"; String regex5 = " +"; //+代表一个或者多个空格 String[] split4 = s6.split(regex5); System.out.println(Arrays.toString(split4)); //3:字符串中,凡是数字就使用"*"代替 String s7 = "asdfsa21323sdf21"; String regex6 = "\\d"; // \d代表数字 ,加一个\表示转义 // String regex6 ="[0-9]"; //与上面的等价 // String regex6 ="[0,1,2,3,4,5,6,7,8,9]"; //与上面的等价 System.out.println(s7.replaceAll(regex6, "*")); } }
例子(重要):
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import java.util.Arrays; /* * 正则表达式分组: * 0 ((A)(B(C))) * 1 (A)(B(C)) * 2 \A * 3 B(C) * 4 \C * 1:叠词切割:"sdqqfgkkkhjppppkl " * 2:将叠词替换成单个字符 */ public class Demo3 { public static void main(String[] args) { String s = "sdsqqfgkkkhjppppkl"; String regex = "(.)\\1+"; //按照重复出现的字符切割 String[] arr= s.split(regex); System.out.println(Arrays.toString(arr)); String s2 = "sdaaafghccccjkqqqqql"; String regex2 = "(.)\\1+"; String replaceAll = s2.replaceAll(regex2, "$1"); //按连续重复出现的字符换成单个字符 System.out.println(s2); System.out.println(replaceAll); } }
(4)
常规的正则使用:Pattern与Mathcher
常规使用步骤:
Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();
例子:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/*String str = "da jia zhu yi le, ming tian bu fang jia, xie xie!";想要获取3个字母组成的单词 */ String str = "da jia zhu yi le, ming tian bu fang jia, xie xie!"; String reg = "\\b[a-z]{3}\\b"; Pattern p = Pattern.compile(reg); Matcher m = p.matcher(str); while(m.find()) { System.out.println(m.start()+"..."+m.end()); System.out.println("sub:"+str.substring(m.start(),m.end())); System.out.println(m.group()); }
(5)案例:
A:校验电话号码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/** * 正则表达式:验证手机号 */ public static final String REGEX_MOBILE = "^((17[0-9])|(14[0-9])|(13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$";
B:校验qq邮箱
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/** * 是否是邮件校验 */ public class test9 { public static void main(String[] args) { String email="22282815808@qq.com"; checkEmail(email); } public static void checkEmail(String email){ String regex="[1-9][0-9]{1,14}@qq.com"; Boolean b=email.matches(regex); System.out.println(b); } }
C:我要学编程
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/** * 我我....我...我.要...要要...要学....学学..学.编..编编.编.程.程.程..程 * 将字符串还原成:“我要学编程”。 */ public class Test10 { public static void main(String[] args) { // 先将字符串中的.去掉, .去掉后,字符串就变了,所以用字符串的替换. String s = "我我....我...我.要...要要...要学....学学..学.编..编编.编.程.程.程..程"; String s2=s.replaceAll("\\.",""); // 将没有.的字符串进行叠词的处理,多个重叠的字保留一个. String s3=s2.replaceAll("(.)\\1+","$1"); System.out.println(s3); } }
D:检验qq号是否符合规则
例子:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/* * 请验证一个字符串是否为qq号 要求:5-15位数字,不能以0开头 * * 经过对比,发现使用正则表达式匹配字符串更简单。 */ public class Demo { public static void main(String[] args) { String qq = "12345"; System.out.println(checkQQ(qq)); System.out.println(checkQQ2(qq)); } private static boolean checkQQ(String qq) { //定义布尔类型变量,记录判断结果,默认是正确的 boolean flag = true; if (qq.length() < 5 || qq.length() > 15) { //判断是否长度不符 flag = false; } else { //长度符合 if (qq.startsWith("0")) { //判断是否以0开头 flag = false; } else { //不以0开头 char[] chs = qq.toCharArray(); //获取qq字符串的字节数组 for (int i = 0; i < chs.length; i++) { //遍历字符数组 if (!(chs[i] >= '0' && chs[i] <= '9')) { //判断是否不是数字 flag = false; break; } } } } return flag; } private static boolean checkQQ2(String qq) { String regex = "[1-9][0-9]{4,14}";//定义一个正则规则 boolean b = qq.matches(regex); //让字符串去适应判断这个规则 return b; } }