JAVA自学笔记14

1、正则表达式
1)是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。其实就是一种规则。有自己的特殊应用
2)组成规则:
规则字符在java.util.regex Pattern类中
常见组成规则:
字符:

x(字符x)、\(反斜线字符)、 \n(换行)、\r(回车符)

字符类:

[abc](a或b或c,简单类) 
 [^abc](除了a/b/c以外的字符) 
 [a-zA–Z](两头的字母也包括在内(范围)) 
 [0-9](0到9的字符都包括)

预定义字符类:

.(任何字符。若要表示.本身,则.) 
 \d(数字:[0-9]) 
 \w(单词字符:[a-zA-Z_0-9])在正则表达式中组成单词的东西必须由这些东西组成

边界匹配器:

^ 行的开头 
 $ 行的结尾 
 \b 单词边界(不是单词字符的地方即[a-zA-Z_0-9])

数量词:(未给定数量词默认一次)

X? X,一次或一次也没有 
 X* X,零次或多次,包括1次 
 X+ X,一次或多次 
 X{n} X,恰好 n 次 
 X{n,} X,至少 n 次 
 X{n,m} X,至少 n 次,但是不超过 m 次

3)判断功能:public boolean matches(String regex)
告知此字符串是否匹配给定的正则表达式

//判断手机号是否符合要求
//录入手机号String phone;
//定义手机号的规则
String regex="1[38]\\d{9}";//规则解释:1开头,出现1次;3或8,出现1次;
//\\d是数字均可;{9},恰好重复9次
boolean flag=phone.matches(regex);

4)分割功能:public String[] split(String regex)
根据给定的正则表达式拆分此字符串,返回字符串数组

regex=”分隔符”; 
 ①String s1=”aa,bb,cc”; 
 regex=”,”; 
 ② String s2=”aa.bb.cc”; 
 regex=”\.”; 
 ③ String s3=”aa bb cc”; 
 regex=” +”; 
 ② String s4=”C:\Java\cc\2”; 
 regex=”\\”;

5)替换功能:public String replaceAll(String regex.String repacement)

eg: String s=”java6221rich1221127ios”; 
 //屏蔽62211221127 
 String regex=”\d”; 
 String s1=”*”;//”“是直接屏蔽 
 s.String replaceAll(regex,s1);

6)获取功能:Pattern与Matcher类的使用
Pattern类:正则表达式的编译表示形式
//典型的调用顺序

//需导包
//把正则表达式编译成模式对象
Pattern p=Pattern.compile("a*b");
//通过模式对象得到匹配器对象,这个时候需要的是被匹配的字符串
Matcher m=p.matcher("aaab");
//调用匹配器对象的功能matches()
boolean b=m.matches();//相当于是判断功能

//获取下面字符串中由3个字符组成的单词

String s=”ads cc sw, evx e a rv”; 
 String regex=”\b\w(3)\b”; 
 //把规则编译成模式对象 
 Pattern p=Pattern.compile(regex); 
 //通过模式对象得到匹配器对象 
 Matcher m=p.matcher(s); 
 //调用匹配器对象的功能 
 //通过find方法查找有没有满足条件的子串 
 boolean flag=m.find; 
 // 调用public String group()方法 
 while(m.find()){ 
 System.out.println(m.group()); 
 }

@例题1:校验一个qq账号
①5~15位数字
②0不能作为开头

public static boolean checkQQ(String qq){

//校验长度
if(qq.length()>=5&&qq.length()<=15){
if(!qq.startWith("0")){
char[] chs=qq.toCharArray();
for(int x=0kx<chs.length;x++){
char ch=char[x];
if(!Character.isDigit(ch)){
return false
}
}
return true;
}
else{
return false;
}
}else{return false;
}
}

用正则表达式改进:

String regex="[1-9][0-9]{4-14}";
//String类中的boolean matches(String regex)方法:告知此字符串是否匹配
//给定的正则表达式
return qq.matches(regex);//即可

@例题2:校验一个邮箱

String email;
//定义规则
String regex="[a-zA-Z_0-9]+@[a-zA-Z_0-9]{2,6}(\\.[a-zA-Z_0-9]{2,3})+";//[a-zA-Z_0-9]可用\w取代
boolean flag =email.matches(regex);

2、Math类
1)Math类包括用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数
2)静态类,成员方法请查看api

@例题4:设计方法获取任意范围内的随机数

public static int getRandom(int start,int end){
int num=(int)(Math.random()*(end-start+1))+start;
return num;
}

3、Random类
1)此类用于产生随机数。如果用相同的种子创建两个Random实例,则对每个实例进行相同的方法调用序列,它们将生成并返回相同的数字序列
2)构造方法:

public Random();//无种子,默认用的是当前时间的毫秒值 
 public Random(long seed);Random r=new Random();
for(int x=0;x<10;x++){
int nextInt();//将生成10个int范围内的随机数
int nextInt(100);//将生成10个0—100范围内的随机数
}

Random r=new Random(1111);//给定种子后,每次得到的随机数是相等的
Random r=new Random();
for(int x=0;x<10;x++){
int nextInt();//将生成10个int范围内的随机数
int nextInt(100);//将生成10个0—100范围内的随机数
}

Random r=new Random(1111);//给定种子后,每次得到的随机数是相等的

3)成员方法:

public int nextInt(); 
 //返回下一个伪随机数,它是取自此随机数生成器的序列中均匀分布的int值 
 public int nextInt(int n); 
 //返回一个伪随机数,在0(包括)至n(不包括)范围内

4、System类
1)静态。包含一些有用的类字段和方法,不能被实例化
2)成员方法:

①public static void gc(); 
 运行垃圾回收器,重写finalize()方法,收回被占用的空间。先释放自己的资源再释放父类的资源。不必频繁手动调用该方法,这样将占用大量的资源。一般不考虑垃圾回收问题。 
 重写finalize()实例: 
 protected void finalize(){ 
 super.finalize(); 
 } 
 ②public static void exit(int status); 
 终止当前正在运行的java虚拟机,非0的状态码表示异常终止,一般用0 
 ③public static long currrentTimeMills(); 
 以毫秒为单位,返回当前时间,可用于估算程序执行时间 
 ④public static void arraycopy(Object src,int srcPos,Objectdest,int destPos,int length);

5、BigInteger类
1)不可变的任意精度的整数。可以让超出Integer的范围的数据进行运算
2)构造方法:BigInteger(String val);
3)成员方法:加减乘除

6、BigDecimal类
1)由于在运算时,float类型和double很容易丢失精度,为了能精确表示计算浮点数,Java提供了BigDecimal
2)不可变的,任意精度的有符号十进制数
3)构造方法:

public BigDecimal(String s);

7、Date
1)Date表示特定的瞬间,精确到毫秒
2)构造方法:

public Date();//根据当前的默认毫秒值创建日期对象 
 public Date(long date);//根据给定的毫秒值创建日期对象

3)成员方法:

①public long getTime();//获取时间,以毫秒为单位 
 对象名.getTime(); 
 ②public void setTime(long time);//设置时间

8、DateFormat类
1)DateFormat是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间
是抽象类,所以使用其子类SimpleDateFormat
2)Date-String(格式化)

//创建日期对象:
Date d=new Date();
//创建格式化对象
SimpleDateFormat sdf=new SimpleDateFormat();//无参,默认模式
String s=sdf.format(d);//调用format方法

//给定模式:在API中查找格式
//年y,月M,日d,时H,分m.秒s
SimpleDateFormat sdf=new SimpleDateFormat(yyyy年MM月dd日HH:mm:ss);

String-Date(解析)

String str="2008-08-08 12:12:12";
SimpleDateFormat sdf2=new SimpleDateFormat(yyyy-MM-dd HH:mm:ss);
//在把一个字符串解析为日期的时候,请注意格式必须与给定的字符串格式匹配
Date dd=sdf2.parse(str);//调用parse方法

@例题5:制作一个工具类DateUtil

public class DateUtil{
private DataUtil(){
public static String dateToString(Date d,String format){
return new SimpleDateFormat(format).format(d);
}
public static Date stringToDate(String s,String format){
return new SimpleDateFormat(format).parse(s);
}
}
}

@例题6:你来到这个世界几天

String line=sc.nextLine();
SimpleDateFormat sdf=new SimpleDateFormat(yyyy-MM-dd);
Date d=sdf.parse(line);

long myTime=d.getTime();
long nowtime=System.currentTimeMillis();

long time=nowTime-myTime;

long day=time/100/60/60/24;

9、Calendar类
1)抽象类
2)成员方法:

public static Calendar getInstance(); 
 Calendar rightNow=Calendar.getInstance();//子类对象,其日历字段已由当前日期初始化public int get(int field) ;//返回给定日历字段的值,日历类中的每个日历字段都是静态的成员常量,并且是Int类型 
 //得到年 
 int year=rightNow.get(Calendar,YEAR);public void add(int field,int amount) 
 根据日历的规则,为给定的日历字段加上或减去指定的时间量。field-日历字段 
 amount-为字段添加的日期或时间量public final void set(int year,int month,int date) 
 设定当前的日历时间

@例题6:获取任意一年的2月有多少天

int year=sc.nextInt();

//设置日历对象的年月日
Calendar c=Calendar.getInstance();,
c,set(year,2,1);//其实是这一年的3月1日,把时间往前推一天,就是二月的最后一天
c.add(Calendar.DATE,-1)