API
全称: Application Progrmming Interface 应用程序的编程接口
在java.lang包下:
基本数据类型、包装类
字符串类 String StringBuffer StringBuilder
比较器 Comparable接口 内部比较器和外部比较器
枚举 Enum
数学类 Math
基类 Object toString equals hashCode getClass finalize
线程 Thread Runtime
系统类 System
异常 Throwable
在java.util包下
输入 Scanner
数组工具 Arrays
日期和时间类型 Date DateFomat Calendar
随机类 Random UUID
集合 Collection List Set Map ArrayList LinkedList HashSet TreeSet HashMap Treemap Collections
在java.io包下
文件类
Math数学类
一个final类,不能被继承;
Math中所有的方法都是static,可以直接类名Math调用;
定义了与数学运算相关的方法。
类变量:
Math.PI
Math.E
类方法:
Math.round() 四舍五入
Math.abs() 绝对值
Math.max() 最大值
Math.random() 随机数 0.0 - – 0.1
大数据
使用BigDecimal BigInteger工具进行超出java 基本数据类型范围的数字之间数学运算、比较运算、位运算
Enum 枚举
一种特殊的类,用于表示一组常量
公有静态常量表示或者接口静态成员实现
package com.etc.day14.api.enum1;
public class DataBase {
public static final String ORALCE_CONN="http://192.168.1.23:8080";
public static final String USERNAME="root";
public static final String PASSWORD="abc123";
}
package com.etc.day14.api.enum1;
public interface DbInterface {
int MONDAY=1;//public static final
}
定义常规的静态常量使用存在小问题:
1.代码可读性差
2.类型不安全
3.耦合性高
4.扩展性差
jdk1.5之后枚举概念
要让某个类型的变量的取值只能为若干个固定值中的一个,否则编译会报错!
语法
访问修饰符 enum 枚举名{
枚举值列表;
}
package com.etc.day14.api.enum1;
public enum Day {
MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY
}
使用枚举值:
输出:
Day day=Day.FRIDAY;
System.out.println(day);//FRIDAY
switch:
switch (day) {
//int boolean String enum
case FRIDAY:
break;
default:
break;
}
枚举拓展
enum 是Java公共基本类
此类中还可以定义自己的方法
public enum Color {
RED("红色",1),GREEN("绿色",2),YELLOW("黄色",3);//The constructor Color() is undefined
private String name;
private int num;
//构造方法私有化,因此不能new;在列举枚举值时调用
private Color(String name,int num) {
this.name=name;
this.num=num;
}
public String getName(){
return name;
}
public static String getName(int num){
return null;
}
}
注意:
1.枚举可以实现接口
2.不能有共有构造方法
3.所有枚举值都是public static final
4.enum覆盖了tostring方法
5.是一个不可被继承的final类
Random随机类
Random rd=new Random();
System.out.println(rd.nextInt());
System.out.println(rd.nextDouble());
Random rd1=new Random(20);
System.out.println(rd1.nextInt(100));//产生一个0-100之间的整数,不包括100
种子数
构造方法参数值,代表一个种子数,无参构造方法,默认当前系统时间毫秒数作为种子数!
Random rd=new Random();
for (int i = 0; i < 10; i++) {
System.out.print(rd.nextInt(10)+" ");//7 1 5 0 9 9 4 5 8 6
}
System.out.println();
Random rd1=new Random(20);
for (int i = 0; i < 10; i++) {
System.out.print(rd1.nextInt(10)+" ");//3 6 1 1 5 5 3 5 3 8
}
System.out.println();
Random rd2=new Random(20);
for (int i = 0; i < 10; i++) {
System.out.print(rd2.nextInt(10)+" ");//3 6 1 1 5 5 3 5 3 8
}
一般计算机的随机数都是伪随机数,以一个真的随机数为种子作为一个初始条件,然后用一定算法不停
迭代产生随机数!
UUID
概述
1. 通用的唯一识别码(Universally Unique Identifier),是唯一的机器生成的标识符!
2. UUID 不能是人工生成
3. UUID 16字节128位长的数字,通常是以36字节的字符表示
jdk1.5之后出现
应用
1. UUID作为数据库数据表的主键
2. 在分布式系统
3. 交易ID(订单ID)
4. 日志框架
生成
UUID uuid=UUID.randomUUID();
System.out.println(uuid);//bcb2e900-19ca-4c1a-909e-680bb5e5b131
使用
public static void main(String[] args) {
UUID uuid=UUID.randomUUID();//版本4方式生成UUID
System.out.println(uuid);//bcb2e900-19ca-4c1a-909e-680bb5e5b131
UUID uuid3=UUID.nameUUIDFromBytes(new byte[0]);
System.out.println(uuid3);//版本3方式生成UUID
//输出版本号
System.out.println(uuid.version());
//输出变体号
System.out.println(uuid.variant());
System.out.println(getUUID32());
}
public static String getUUID32(){
return UUID.randomUUID().toString().replace("-", "").toLowerCase();
}
Date时间类
Date类 获取特点的一个瞬间,精确到毫秒 1000毫秒=1秒
毫秒0点:时间原点:1970年1月1日 午夜0:00:00 (英国格林威治)
中国时间原点:1970年1月1日 早上8:00:00
格林威治标准时间(GMT)
创建
Date d1=new Date();
//获取当前系统时间和日期
System.out.println(d1);//Wed Mar 24 09:58:36 CST 2021 当前时间
/*
*构造方法参数:表示一个毫秒值 ,long类型
*具体时间原点的一个时间
*/
Date d2=new Date(0);
System.out.println(d2);//Thu Jan 01 08:00:00 CST 1970
Date d3=new Date(1000L);
//Date d3=new Date(1000);
System.out.println(d3);//Thu Jan 01 08:00:01 CST 1970
//通过构造方法参数,获取当前时间
System.out.println(System.currentTimeMillis());
System.out.println(new Date(System.currentTimeMillis()));//Wed Mar 24
10:08:13 CST 2021
//格林威治时间原点
System.out.println(d1.toGMTString());//24 Mar 2021 02:10:45 GMT
System.out.println(d2.toGMTString());//1 Jan 1970 00:00:00 GMT
常用方法
Date date=new Date();
//date日期转换为毫秒值(距离时间原点的毫秒值)
long time=date.getTime();
System.out.println(time);//1616552102010
System.out.println(System.currentTimeMillis());//1616552102010
//将日期对象设置到指定的毫秒值上
Date date1=new Date();
System.out.println(date1);//Wed Mar 24 10:17:01 CST 2021
date1.setTime(0);//相当于 Date date=new Date(0)
System.out.println(date1);//Thu Jan 01 08:00:00 CST 1970
//比较时间
boolean sign=date.after(date1);
System.out.println(sign);//trueSimpleDateFormat类
实现日期和字符串转换
时间类型转换为字符串类型
格式化日期(默认格式)
按照指定格式进行格式化日期
String转换Date
boolean sign2=date.before(date1);
System.out.println(sign2);//false
int result=date.compareTo(date1);
System.out.println(result);//-1 1 0
SimpleDateFormat类
作用: 实现日期和字符串转换
时间类型转换为字符串类型
//时间类型转换为字符串类型
Date date=new Date();
String ds=date.toString();
System.out.println(ds.trim());//Wed Mar 24 10:24:53 CST 2021 字符串
格式化日期(默认格式)
//格式化日期(默认格式) 年后两位-月-日 上下午时-分
SimpleDateFormat format=new SimpleDateFormat();
String dateForm=format.format(date);
System.out.println(dateForm.trim());//21-3-24 上午10:26
按照指定格式进行格式化日期
//按照指定格式进行格式化日期 年-月-日 时-分-秒
//y 年 M 月 d 日 H 时 m 分 s 秒
SimpleDateFormat format2=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss E w W
F");
String dateForm2=format2.format(date);
System.out.println(dateForm2);//2021-03-24 10:47:26 星期三 13 4 4
String转换Date
//String转换Date
String str="2021-03-20 15:30:10";
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date=sdf.parse(str);//字符串--》时间
System.out.println(date);//Sat Mar 20 15:30:10 CST 2021
//注意:格式样式必须和字符串样式保持一致
Calender类: 抽象类 设置或者获取时间使用
创建
//创建日历第一种方法
Calendar cal=new GregorianCalendar();//cal对象放置所有当前系统时间相关的属性:毫秒
System.out.println(cal.getWeekYear());
//设置时间
cal.set(Calendar.YEAR, 2019);
cal.set(Calendar.MONTH, 11);
cal.set(Calendar.DAY_OF_MONTH, 22);
System.out.println(cal);
//创建日历第二种方法
Calendar cal1=Calendar.getInstance();
//calendar-->date
System.out.println(cal1.getTime());//Wed Mar 24 13:19:39 CST 2021
System.out.println(cal.getTime());//Sun Dec 22 13:20:01 CST 2019
//date-->calendar
cal1.setTime(new Date());
System.out.println(cal1.getWeekYear());
java.time包 时间处理一些类 jdk8新特性
获取时间
LocalDate类
//设置日期
LocalDate ld=LocalDate.of(2021, 2, 4);
System.out.println(ld);//2021-02-04
System.out.println(ld.getDayOfMonth());
System.out.println(ld.getDayOfYear());//此日期在一年中第几天
System.out.println(ld.lengthOfMonth());//28 日期当前月的总天数
System.out.println(ld.isLeapYear());//false
//获取当前系统日期
System.out.println(LocalDate.now());//2021-03-24
LocalTime类
//设置时间
LocalTime lt=LocalTime.of(22, 10, 59);
System.out.println(lt);//22:10:59
System.out.println(lt.getHour());//22
System.out.println(lt.getMinute());//10
//获取当前系统的时间
System.out.println(LocalTime.now());//15:57:23.126
//Invalid value for SecondOfMinute (valid values 0 - 59): 62
LocalTime lt1=LocalTime.of(22, 10, 62);
System.out.println(lt1);
LocalDateTime类
//设置日期时间
LocalDateTime ldt=LocalDateTime.of(2020, 2, 14, 10, 10);
System.out.println(ldt);//2020-02-14T10:10
//LocalDateTime 转 LocalDate
//LocalDateTime 转 LocalTime
LocalDate ld=ldt.toLocalDate();
LocalTime lt=ldt.toLocalTime();
Instant类
和date一样获取系统时间,获取美国时间
Instant ist=Instant.now();
System.out.println(ist);//2021-03-24T08:05:01.788Z
时间间隔
Duration类
用来衡量秒级或者纳秒级的时间间隔 例如“34.7秒”
LocalDateTime ldt1=LocalDateTime.of(2021, 11, 15, 15, 0, 0);
LocalDateTime ldt2=LocalDateTime.of(2021, 11, 15, 16, 10, 30);
Duration d=Duration.between(ldt1, ldt2);
System.out.println(d);//PT1H10M30S
System.out.println(d.toMillis());//4230000
System.out.println(d.toHours());//1
System.out.println(d.toMinutes());//70
Period类
用来衡量天 例如"3年4个月5天"
LocalDate ldt1=LocalDate.of(2021,3, 2);
LocalDate ldt2=LocalDate.of(2021,8, 26);
//LocalDate ldt2=LocalDate.now();
Period p=Period.between(ldt1, ldt2);
System.out.println(p);//P4M9D
System.out.println(p.getMonths()+"个月"+p.getDays()+"天");//4个月9天
注意:
获取相差总天数,只能用Duration !!!
ChronoUnit类(枚举)
时间单位
between方法,计算时间间隔
LocalDate ldt1=LocalDate.of(2021,3, 2);
LocalDate ldt2=LocalDate.of(2023,8, 26);
long year=ChronoUnit.YEARS.between(ldt1, ldt2);
System.out.println(year);//2
System.out.println(ChronoUnit.WEEKS.between(ldt1, ldt2));//129
例题:
写程序,(Scanner)当以年-月-日的格式输入一个日期时,输出其该年是否为闰年,该月有几天,该日是星期几?
解题思路:
1.使用SimpleDateFormat来将输入的时间进行格式转化为Date格式
2.使用Date初始化一个Calendar
3.使用Calendar中的方法获得对应结果
public class test9 {
public static void main(String[] args) throws ParseException {
Scanner sc = new Scanner(System.in);
SimpleDateFormat sd = new SimpleDateFormat();
sd.applyPattern("yyyy年MM月dd日");
System.out.println("请输入一个日期:");
String time = sc.nextLine();
Date dt = sd.parse(time);
Calendar ca = Calendar.getInstance();
ca.setTime(dt);
GregorianCalendar g = new GregorianCalendar();
if(g.isLeapYear(ca.get(Calendar.YEAR))){
System.out.println(ca.get(Calendar.YEAR)+"年是闰年");
}else{
System.out.println(ca.get(Calendar.YEAR)+"年不是闰年");
}
System.out.println("这一个月有"+ ca.getActualMaximum(Calendar.DATE) +"天");
System.out.println("这一天是周"+ (ca.get(Calendar.DAY_OF_WEEK)-1));
}
}