JAVA中部分API(下)

6)math类

包含执行基本数字运算的方法,Math类没有提供公开的构造器,通过类名.方法名使用

如何使用类中的成员呢?看类的成员是否都是静态的,如果是,通过类名就可以直接调用

//public static int abs(int a)	获取参数绝对值
//public static double ceil(double a) 向上取整
//public static double floor(double a)	向下取整
//public static int round(float a)	四舍五入
//public static int max(int a,int b)	获取两个int值中的较大值
//public static double pow(double a,double b) 返回a的b次幂的值
//public static double random() 返回值为double的随机值,范围[0.0,1.0) 包前不包后

7)System类

System也是一个工具类,代表了当前系统,提供了一些与系统相关的方法。

没有提供公开的构造器,通过类名.方法名使用

//System系统类
//in out err 静态常量
System.err.print("xx");

//常用方法
System.exit(0);//表示正常终止应用程序
long time = System.currentTimeMillis();//返回1970年1月1日0点作为起点到现在的毫秒总数

public static void exit(int status)//终止当前运行的 Java 虚拟机,非零表示异常终止
    
public static long currentTimeMillis()//返回当前系统的时间毫秒值形式
long time = System.currentTimeMillis();//返回1970年1月1日0点作为起点到现在的毫秒总数
//可以做时间的计算:性能分析
long startTime = System.currentTimeMillis();
for(int i = 0;i<10000;i++){
    syso("输出:"+i);
}
long endTime = System.currentTimeMillis();
syso((endTime-startTime)/1000.0+"s");

public static void arraycopy(数据源数组, 起始索引, 目的地数组, 起始索引, 拷贝个数)//数组拷贝
int[] arr1 = {10,20,30,40};
int[] arr2 = new int[5];
system.arraycopy(arr,2,arr2,4);
syso(Arrays.toString(arr2));
    

8)BigDecimal类

用于解决浮点数失真,调方法得对象是最好的方法
image

public class BigDecimalDemo {
	public static void main(String[] args) {
	    // 浮点型运算的时候直接+  * / 可能会出现数据失真(精度问题)。
		System.out.println(0.09 + 0.01);
		System.out.println(1.0 - 0.32);
		System.out.println(1.015 * 100);
		System.out.println(1.301 / 100);
		System.out.println("-------------------------");
		double a = 0.1;
		double b = 0.2;
		double c = a + b;
		System.out.println(c);
		//包装浮点型数据成为大数据对象 BigDeciaml
		BigDecimal a1 = BigDecimal.valueOf(a);
		BigDecimal b1 = BigDecimal.valueOf(b);
		BigDecimal c1 = a1.add(b1);
		System.out.println(c1);
		System.out.println("-------------------------");
		//再转化为double类型
		c = c1.doubleValue();
		System.out.println(c);
		
		//注意事项:BigDecimal是一定要精度运算的
        //获取对象BigDecimal b1 = BigDecimal.valueOf(0.1);
		BigDecimal a11 = BigDecimal.valueOf(10.0);
		BigDecimal b11 = BigDecimal.valueOf(3.0);
		//BigDecimal c11 = a11.divide(b11);//会报错因为除不尽
		/**
		 * 参数一: 除数 参数二:保留小数位数  参数三:舍入模式
		 */
		BigDecimal c11 = a11.divide(b11,2,RoundingMode.HALF_UP);
		
	}
}

9)正则表达式(regular expression)

(1)基本匹配

描述了一种字符串匹配的模式,按照特点格式对字符串进行验证匹配

是由普通字符和特殊字符组成的字符串

有regex -----表示支持正则

eg:str.replaceAll(regex,replecement);
image

特殊字符(元字符)

//在没有使用元符号的时候,相当于做equals比较
String str = "hello";
String regex = "h";
syso(str.matches(regex));//false
regex = "hello";
syso(str.matches(regex));//true

//元符号  ? -- 匹配前面的子表达式零次或一次返回true
String str = "hello";
String regex = "h?";
syso(str.matches(regex));//false
String str = "xxx";
String regex = "h";
syso(str.matches(regex));//false
String str = "hh";
String regex = "h?";
syso(str.matches(regex));//false
//从第一位开始匹配
String str = "ah";
String regex = "h?";
syso(str.matches(regex));//false
String str = "";
String regex = "h?";
syso(str.matches(regex));//true
String str = "h";
String regex = "h?";
syso(str.matches(regex));//true

//元符号 +---匹配前面的子表达式一次或多次
	str = "111aa";
	regex = "1+a";
	System.out.println(str.matches(regex));//false

	str = "111a";
	regex = "1+a";
	System.out.println(str.matches(regex));//true

	str = "1a";
	regex = "1+a";
	System.out.println(str.matches(regex));//true

//* --匹配零次或多次(不包含一次)
//a* --匹配a零次或多次

//a{5} --匹配确定的a 5次

//a{5,7} --a出现5-7次

//a{5,} --a出现5-无数次

//^1 --以1开头

//a$ --以$结尾

//x|y --匹配x或y

//[xyz] --匹配是x或y或z的一个字符

//[^xyz] --匹配不是x、y、z的字符

//[a-z]  --匹配一个a-z的字符
//[a-z]{5} --匹配五个a-z的字符
//([A-Z]|[a-z]){4} --匹配大写或小写字符四次
//([A-Z]|[a-z]){4} --匹配一次大写字母 或 四次小写字母

//\d  --匹配一个数字字符 ==[0-9]
//\D  --匹配一个非数字 ==[^0-9]   
在JAVA中使用带\的正则时需要多加一个\
//\w --匹配包括下划线的任何单词字符,等价[A-Za-z0-9_]
//\W --匹配任何非单词字符,等价于^[A-Za-z0-9_]


\\判断一个号码是不是手机号
regex = "^1[3-9][0-9]{9}";//以一开头第二个数字是0-9,后面9位都是数字的手机号

(2)字符串中正则的应用

image

(3)正则表达式爬取信息

image

10)Date类 (util下,不是sql下的)+Calendar类

(1)Date类

Date类代表当前所在系统的日期时间信息

1、日期对象如何创建,如何获取时间毫秒值?
public Date();
public long getTime();
2、时间毫秒值怎么恢复成日期对象
public Date(long time);
public void setTime(long time);

计算当前时间往后走1小时121秒之后的时间是多少

image

(2)SimpleDateFormat类作用

可以对Date对象或时间毫秒值格式化成我们喜欢的时间形式

也可以把字符串时间解析成日期对象

构造方法:

无参构造一般不用,通常使用有参构造

public SimpleDateFormat(String pattern)---构造一个SimpleDateFormat,使用指定的格式

SimpleDateFormat sfs = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss EEE a");
//EEE --- 星期几
//a -- 上午还是下午

格式化方法:

public final String format(Date date) ------将日期格式化成日期/时间字符串

public final String format(Object time) ------将时间毫秒值式化成日期/时间字符串

image

解析时间:

解析字符串时间成为日期对象:2011-11-11 11:11:22 -> Date日期对象

public Date parse(String source) ------> 从给定字符串的开始解析文本以生成日期

Date date = new Date();
//返回1970年1月1日0点到现在的毫秒数
long num = date.getTime();//与System.currentTimeMillis();相同
//date默认是当时的时间
		String birthday = "2000-1-1"
		Date date = new Date();
		SimpleDateFormat sfs = new SimpleDateFormat("yyyy-MM-dd");
		try {
            //String -->Date
			date = sfs.parse(birthday);//会把date设置为 "2000-1-1"
		} catch (ParseException e) {
			System.out.println("生日格式输入不合法!");
			return false;
		}
//这里date值改变了
// date.getTime();变成了从2000年到1970年的毫秒数





public class RegexDemo {
	public static void main(String[] args) {
		
		//java.util.Date; 日期类  有构造方法
		Date date  = new Date();
		System.out.println(date.getTime());
		
		System.out.println(date);
		//日期转换类 hh-12小时制  HH-24小时制
		SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
		//将一个日期转为指定格式的字符串 Date -->String
		String dateFormat = sf.format(date);
		System.out.println(dateFormat);
		
		String string = "2011-10-01";
		//将字符纯转换为日期格式
		SimpleDateFormat sfs = new SimpleDateFormat("yyyy-MM-dd");
	
		try {
			Date d = sfs.parse(string);
			System.out.println(d);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		//calebdar 日历类,无构造方法
		//有getInstance方法
		Calendar c = Calendar.getInstance();
		//返回当前系统时间
		System.out.println(c.getTimeInMillis());
		//返回Date对象,对象时间是当前时间,或设置后的时间
		Date date2 = c.getTime();
		//get 获取日期
		System.out.println(c.get(1));//年
		System.out.println(c.get(Calendar.YEAR));
		System.out.println(c.get(2));//月
		System.out.println(c.get(Calendar.MONTH));
		System.out.println(c.get(3));//今年的第几周
		System.out.println(c.get(Calendar.WEEK_OF_YEAR));
		System.out.println(c.get(6));//今年的第几天
		System.out.println(c.get(Calendar.DAY_OF_YEAR));
		System.out.println(c.get(5));//这个月的第几天
		System.out.println(c.get(Calendar.DAY_OF_MONTH));
		System.out.println(c.get(4));//这周的第几天,周日开始算
		System.out.println(c.get(Calendar.DAY_OF_WEEK));
		//set 设置日历数据的某个字段
		c.set(1, 2011);
		System.out.println(c.get(Calendar.YEAR));
        //设置年月日,改变当前时间,分钟及其后面的使用系统时间
        c.set(year,month,day);
        c.getTimeInMillis();//返回设置时间到70年毫秒数
        //在当前基础上增加
        c.add(Calendar.DAY_OF_MONTH,2);
        
	}
}


11)Random类、UUID类

Random类
  1. 1)Random(long seed):使用单个long种子创建一个新的随机数生成器

    ​ 可以在构造Random对象的时候指定种子

    ​ eg: Random r1 = new Random(20);

    2)或者默认当前系统时间的毫秒数作为种子数

    ​ eg:Random r1 = new Random();

    初始化时seed 20并没有起直接作用(注意:不是没有起作用)

    Random r1 = new Random(20);
    int i = r1.nextInt(100);//调用r1中的100是随机数的上限,产生的随机数为0-100的整数,不包括100。
    Random r2 = new Random(20);
    int j = r2.nextInt(100);//对于种子相同的Random对象,生成的随机数序列是一样的。
    
    

    另外,直接使用Random无法避免生成重复的数字,如果需要生成不重复的随机数序列,需要借助数组和集合类

  2. java.utl.Random类摘要

    protected int next(int bits):生成下一个伪随机数。
    boolean nextBoolean():返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的boolean值。
    void nextBytes(byte[] bytes):生成随机字节并将其置于用户提供的 byte 数组中。
    double nextDouble():返回下一个伪随机数,它是取自此随机数生成器序列的、在0.0和1.0之间均匀分布的 double值。
    float nextFloat():返回下一个伪随机数,它是取自此随机数生成器序列的、在0.0和1.0之间均匀分布float值。
    double nextGaussian():返回下一个伪随机数,它是取自此随机数生成器序列的、呈高斯(“正态”)分布的double值,其平均值是0.0标准差是1.0。
    int nextInt():返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的 int 值。
    int nextInt(int n):返回一个伪随机数,它是取自此随机数生成器序列的、在(包括和指定值(不包括)之间均匀分布的int值。
    long nextLong():返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的 long 值。
    void setSeed(long seed):使用单个 long 种子设置此随机数生成器的种子。

  3. 几个例子

    下面给几个例子:

    生成[0,1.0)区间的小数:double d1 = r.nextDouble();
    生成[0,5.0)区间的小数:double d2 = r.nextDouble() * 5;
    生成[1,2.5)区间的小数:double d3 = r.nextDouble() * 1.5 + 1;
    生成

    -2的31次方 到 2的31次方-1 之间的整数:int n = r.nextInt();
    生成[0,10)区间的整数:
        int n2 = r.nextInt(10);//方法一

        n2 = Math.abs(r.nextInt() % 10);//方法二

UUID类
//UUID类,无构造方法
//32位16进制值的唯一一个随机数
UUID uuid = UUID.randomUUID();
syso(uuid);

12)新增日期API

JDK8新增日期类,java.time包提供了新的日期和时间API

LocalDate:不包含具体时间的日期。
LocalTime:不含日期的时间。
LocalDateTime:包含了日期及时间。
Instant:代表的是时间戳。
DateTimeFormatter 用于做时间的格式化和解析的
Duration:用于计算两个“时间”间隔
Period:用于计算两个“日期”间隔

新增的API严格区分了时刻、本地日期、本地时间,并且,对日期和时间进行运算更加方便。其次,新API的类型几乎全部是不变类型(和String的使用类似),可以放心使用不必担心被修改。

(1)LocalDate、LocalTime、LocalDateTime

LocalDate

image

image

LocalTime
image

localDateTime:啥都可以拿,也可以向其他两者转换
image

image

LocalDateTime 综合了 LocalDate 和 LocalTime 里面的方法,所以下面只用 LocalDate 和 LocalTime 来举例。
这些方法返回的是一个新的实例引用,因为LocalDateTime 、LocalDate 、LocalTime 都是不可变的。

时间的更改(增删):

image

时间的判断:

image

(2)Instant

时间戳是包含日期和时间的,与java.util.Date很类似,事实上Instant就是类似JDK8 以前的Date。
Instant和Date这两个类可以进行转换。

image

(3)DateTimeFormatter

image

(4)period类

用于计算“日期”间隔差异,主要用于LocalDate之间的比较

image

(5)Duration

精准计算差多少天多少小时,计算“时间”间隔

image

(6)ChronoUnit

用于在单个时间单位内测量一段时间

image

13)Arrays类

数组操作工具,专门用于操作数组元素。

(1)方法

image

(2)Arrays类对于Comparator比较器的支持

public static <T> void sort(类型[] a, Comparator<? super T> c)----------使用自定义的比较器对象来定制比较规则

如果认为左边数据 大于 右边数据 返回正整数
如果认为左边数据 小于 右边数据  返回负整数
如果认为左边数据  等于 右边数据  返回0
posted @ 2022-05-23 20:44  夜色哪里都是美  阅读(25)  评论(0)    收藏  举报