Java基础(七)——常用类(二)

正则表达式

正则表达式定义字符串的搜索模式,其它语言也适用

语法规则:

.	匹配任何字符
^	匹配输入字符串开始的位置。
$	匹配输入字符串结尾的位置。
[abc]	匹配组中出现的单个字母A或B或C。例如,"[abc]"匹配”jian”中的”a”。。
[abc][vz]	匹配2个字符,第一个匹配a或b或c,第二个匹配v或z。	
[^abc]	匹配未包含的任何字符。例如,"[^abc]"匹配”an”中”n”。
[a-d1-7]	匹配范围:从a-d和数字1-7之间的单个字符,
a|b	匹配a或者b,优先匹配前者,匹配上就不在匹配后者
()	优先匹配括号内的表达式

元字符 :

一个预先定义的字符
\d	数字字符匹配。
\D	非数字字符匹配。
\s	匹配任何空白字符,包括空格、制表符、换页符等。
\S	匹配任何非空白字符。
\w	垂直制表符匹配。
\W	匹配任何字类字符,包括下划线。
\S	匹配任何非空白字符
\b	匹配一个单词边界
\\	匹配一个反斜线
\t	匹配一个制表符
\n	匹配一个换行符
\r	匹配一个回车符

量词

*	出现零次或更多次
+	发生一次或多次
?	发生0次或一次
{n}	非负整数。正好匹配 n 次。
{n,m}	匹配n-m次
*?		?放在量词后表示非贪婪匹配

与正则表达式相关的方法

	java.util.regex下的Pattern类和Matcher类提供了对正则的支持
	使用Pattern类进行字符串的拆分,
	使用的方法是String[] split(CharSequence input)
	
	使用Matcher类进行字符串的验证和替换,
	匹配使用的方法是boolean matches()
	替换使用的方法是 String replaceAll(String replacement)
	为了方便我们很少直接使用Pattern类或Matcher类,
	而是使用String类下的方法
String s = "abcfg1254gfg";
//字符串是否匹配正则表达式,返回true/false
System.out.println(s.matches("[a]"));//fasle
//根据正则切割字符串,返回字符串数组
s.split("[g]")		
//根据正则替换字符串
System.out.println(s.replaceAll("[\\d]", "h"));//替换数字为h字符串

//匹配11位手机号
String s = "15545865951";
System.out.println(s.matches("(13|14|15|17|18|19)[0-9]{9}"));//true
System.out.println(s.matches("1[345789][\\d]{9}"));//true
String类没有获取匹配成功后返回匹配项的方法
如果需要返回匹配的结果项,可以使用Pattern类和Matcher类
		String s = "1.5-0.3+3.5+6-7";
		//定义一个正则模式对象,匹配正整数
		Pattern pattern = Pattern.compile("\\d+");
		// 通过模式对象得到一个匹配器对象
		Matcher matcher = pattern.matcher(s);
		while (matcher.find()) {// 如果满足匹配规则,返回true
			System.out.print(matcher.group() + " ");// 取出满足条件的值
		}//1 5 0 3 3 5 6 7 
		//结果并不是我们想象的数值,应该先取小数再取整数

		//重新定义正则规则,优先匹配小数\\d+\\.\\d+,小数匹配不上再匹配整数
		Pattern pattern = Pattern.compile("\\d+\\.\\d+|\\d+");
		//1.5 0.3 3.5 6 7
		//负数没有匹配上
	
		//再次定义,优先匹配负数
		Pattern pattern = Pattern.compile("-\\d+\\.\\d+|-\\d+|\\d+\\.\\d+|\\d+");
		//还可以定义匹配小数点后1位至3位数\\d+\\.\\d{1,3}

Date类

日期类,提供了针对日期进行操作的诸多方法,精确到毫秒值
1000毫秒 = 1秒
Date类现在并不推荐使用,Java推荐了Calendar和DateFormat,
甚至SimpleDateFormat来替代它
//Date类的空参构造默认返回当前系统的时间,改变系统时间,date的值也会变
Date date = new Date();
System.out.println(date);//Wed Feb 05 21:25:07 CST 2050

//Date类的有参构造,传入一个long类型的毫秒值,自动转为对应的具体时间
Date date = new Date(System.currentTimeMillis());
//System.currentTimeMillis()返回系统当前距离1970年0点0分0秒的毫秒值
Date date = new Date(0);
System.out.println(date);
//Thu Jan 01 08:00:00 CST 1970

//获取当前时间的毫秒值,和System.currentTimeMillis()作用一致
date.getTime()
//修改当前时间,传入一个long类型的毫秒值,将之转为时间赋值为date
date.setTime(10000000);
//其余方法
//Date1.after(Date2),当Date1大于Date2时,返回TRUE
//Date1.before(Date2),当Date1小于Date2时,返回TRUE



DateFormat类

进行日期格式的转化
由于是抽象类只能使用它的子类SimpleDateFormat
DateFormat类的方法String format(Date date):将日期格式转换为字符串
DateFormat类的方法Date parse(String str):将String转换为Date类型
// 将String转为Date类型
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf.parse("2050-5-9");
System.out.println(date);
// Mon May 09 00:00:00 CST 2050

//将Date类型转为String
String format = sdf.format(date);
System.out.println(format);//2050-05-09

Calendar类

日历类,功能要比Date类强大很多,可以方便的进行日期的计算,获取日期中的信息
替换了很多Date类的方法,较常用
是一个抽象类,不能直接创建对象,通过静态方法来获取子类对象
// 获取Calendar子类对象
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);// 获取年份
int month = calendar.get(Calendar.MONTH);// 获取月份
int day = calendar.get(Calendar.DATE);// 获取日期天数
....
...
calendar.set(Calendar.DATE,10);//修改时间的日期天数
....
....
calendar.add(Calendar.DATE, 10);//天数后移10天
calendar.add(Calendar.YEAR, -10);//年份往前推10年
....
....
Date time = calendar.getTime();//将日历类对象转为日期类对象

做一个万年历

根据输入的年份和月份,自动输出对应的每月的日历表
星期一	星期二	星期三	星期四	星期五	星期六	星期日
										1		2	
3		4		5		6		7		8		9	
10		11		12		13		14		15		16	
17		18		19		20		21		22		23	
24		25		26		27		28		29	
package wnl;

import java.util.Scanner;

/*
 * 根据输入的年份和月份获取当月的月历
 * 1.1900年1月1日为星期1
 * 2.根据输入年份获取距离1990年的天数,并判断闰年平年,能被4整除并且不能被100整除或能被400整除的为闰年
 * 3.根据输入月份获取之前所有月份相加的天数
 * 4.前2者天数相加+1,对7求余得到的就是输入月份的1号是星期几
 * 5.遍历输出当前月份的月历
 * 
 */
public class wnl_1 {

	public static void main(String[] args) {
		//键盘输入年份和月份
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入年份:");
		int year = sc.nextInt();
		System.out.println("请输入月份:");
		int month = sc.nextInt();
		
		//计算当年距离1900年的天数
		int yearDays = 0;
		for(int i = 1900;i<year;i++) {
			if(i % 4 == 0 && i % 100 != 0 || i % 400 == 0) {
				yearDays += 366;
			}else {
				yearDays += 365;
			}
		}
		//判断年份是闰年还是平年
		boolean x = false;
		if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
			x = true ;
		}
		
		//计算当前月份之前的天数
		int monthDays = 0;
		for(int a = 1;a < month; a++ ) {
			switch(a) {
			case 1:
			case 3:
			case 5:
			case 7:
			case 8:
			case 10:
			case 12:
				monthDays += 31;
				break;
			case 4:
			case 6:
			case 9:
			case 11:
				monthDays += 30;
				break;
			default:
				if(x) {
					monthDays += 29;
				}else {
					monthDays += 28;
				}
				
		}
	}
			
			//将天数相加+1,求得当前月份1号的星期数
			int week = (yearDays + monthDays + 1) % 7;
			System.out.println(week);
			//获取输入月份的天数
			int mDay = 0;
			switch(month) {
			case 1:
			case 3:
			case 5:
			case 7:
			case 8:
			case 10:
			case 12:
				mDay = 31;
				break;
			case 4:
			case 6:
			case 9:
			case 11:
				mDay = 30;
				break;
			default:
				if(x) {
					mDay = 29;
				}else {
					mDay = 28;
				}
			}
				
			//输出月历表头
			System.out.print("星期一\t星期二\t星期三\t星期四\t星期五\t星期六\t星期日\n");
			
			for(int b = 1;b < week;b++) {
				System.out.print("\t");
			}
			
			for(int c = 1;c <= mDay;c++) {
				System.out.print(c+"\t");
				if((c + week -1) % 7 == 0) {
					System.out.println();
				}
			}
	}
}

Math类

	和数学计算有关的类
	int abs(int a):绝对值
	double ceil(12.34)//13.0 向上取整
	double floor(12.56)//12.0 向下取整
	int max(int a ,int b) 获取两个数中的最大数
	double pow(double a ,double b) pow(2,3) = 8.0 //a的b次幂,double 类型
	double random():随机数【0.0,1)
	int round(float f):四舍五入 原理:小数加上0.5,再转换成int类取整
	long round(double d):四舍五入

System类

全是静态方法,无法实例化
gc():调用垃圾回收器释放内存资源,实质是调用Object的finalize方法
exit(int n);终止当前运行的虚拟机,一般n为0,非0为异常终止
currentTimeMillis();返回毫秒为单位的当前时间

BigInteger类

可以存储数值更大的整数
构造方法:
BigInteger a = new BigInteger("100");
a.add(b) 加法
a.subtract(b) 减法
a.multiply(b) 乘法
a.divide(b) 除法

BigDecimal类

float和double容易丢失精度
0.09+0.01 = 0.0999999999999
为了精确表示,Java提供了BigDecimal类.
在大多数的商业计算中,一般采用java.math.BigDecimal类来进行精确计算
只有这个构造new BigDecimal(String val)数据才是准确的
a.add(b) 加法
a.subtract(b) 减法
a.multiply(b) 乘法
a.divide(b)	除法
BigDecimal d = new BigDecimal("0.09");
BigDecimal d2 = new BigDecimal("0.01");
BigDecimal bigDecimal = d.add(d2);
System.out.println(bigDecimal);
//构造器中的参数不建议传入Double,会有一定的不可预知性
//建议优先传入String
发布了30 篇原创文章 · 获赞 0 · 访问量 361

猜你喜欢

转载自blog.csdn.net/qq_31241107/article/details/104180767