day04_API2
1. Math、System、Runtime
1.1 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) |
1.2 System
方法名 | 说明 |
---|
public static void exit(int status) | 终止当前运行的Java虚拟机 |
public static long currentTimeMillis() | 返回当前系统的时间毫秒值形式 |
- 时间毫秒值:指的是从1970年1月1日00:00:00走到此刻的总的毫秒数,1s = 1000ms。
1.3 Runtime
- 代表程序所在的运行环境
- Runtime是一个单例类
方法名 | 说明 |
---|
public static Runtime getRuntime() | 返回与当前Java应用程序关联的运行时对象 |
public void exit(int status) | 终止当前运行的虚拟机 |
public int availableProcessors() | 返回Java虚拟机可用的处理器数 |
public long totalmemory() | 返回Java虚拟机中的内存总量 |
public long freeMemory() | 返回Java虚拟机中的可用内存 |
public Process exec(String command) | 启动某个程序,并返回代表该程序的对象 |
2. BigDecimal
- 由于浮点型运算时, 直接+ - * / 可能会出现运算结果失真
- BigDecimal就用于解决浮点型运算时,出现结果失真的问题
2.1 构造方法
构造器 | 说明 |
---|
public BigDecimal(double val) | 将double转换为BigDecimal(不推荐) |
public BigDecimal(String val) | 把String转成BigDecimal |
2.2 常用方法
方法名 | 说明 |
---|
public static BigDecimal valueOf(double val) | 转换一个double成BigDecimal |
public BigDecimal add(BigDecimal b) | 加法 |
public BigDecimal subtract(BigDecimal b) | 减法 |
public BigDecimal multiply(BigDecimal b) | 乘法 |
public BigDecimal divide(BigDecimal b) | 除法 |
public BigDecimal divide(另一个BigDecimal对象, 精确几位, 舍入模式) | 除法,可以控制精确到小数几位 |
public double doubleValue() | 将BigDecimal转换为double |
3. JDK8之前传统的日期、时间【白雪警告】
3.1 Date
构造方法 | 说明 |
---|
public Date() | 创建一个Date对象,代表的是系统此刻的日期时间 |
public Date(long time) | 把时间毫秒值转换成Date日期对象 |
常见方法 | 说明 |
---|
public long getTime() | 返回从1970年1月1日00:00:00到此刻的总毫秒数 |
public void setTime(long time) | 设置日期对象的时间为当前时间毫秒值对应的时间 |
3.2 SimpleDateFormat
- 代表简单日期格式化,可以用来把日期对象、时间毫秒值格式化成我们想要的形式
常见构造器 | 说明 |
---|
public SimpleDateFormat(String pattern) | 创建简单日期格式化对象,并封装时间的格式 |
常用方法 | 说明 |
---|
public final String format(Date date) | 将日期格式化成日期/时间字符串 |
public final String format(Object time) | 将时间毫秒值格式化成日期/时间字符串 |
public Date parse(String source) | 把字符串时间解析成日期对象 |
-
时间格式的常见符号:
符号 | 说明 |
---|
y | 年 |
M | 月 |
d | 日 |
H | 时 |
m | 分 |
s | 秒 |
EEE | 星期 |
a | 上午/下午 |
2020-11-11 13:27:06 ➡️ yyyy-MM-dd HH:mm:ss
2020年11月11日 13:27:06 ➡️ yyyy年MM月dd日 HH:mm:ss
3.3 Calendar
- 代表的是系统此刻时间对应的日历
- 通过它可以单独获取、修改时间中的年、月、日、时、分、秒等
- calendar是可变对象,一旦修改后其对象本身表示的时间将产生变化
方法名 | 说明 |
---|
public static Calender getInstance() | 获取当前日历对象 |
public int get(int field) | 获取日历中的某个信息 |
public final Date getTime() | 获取日期对象 |
public long getTimeInMillis() | 获取时间毫秒值 |
public void set(int field, int value) | 修改日历的某个信息 |
public void add(int field, int amount) | 为某个信息增加/减少指定的值 |
4. JDK8开始新增的日期、时间
4.1 为什么要新增时间日期
- JDK8之前传统的时间API
- 设计不合理,使用不方便,很多都被淘汰了
- 都是可变对象,修改后会丢失最开始的时间信息
- 线程不安全
- 只能精确到毫秒
- JDK8开始之后新增的时间API
- 设计更合理,功能丰富,使用更方便
- 都是不可变对象,修改后会返回新的时间对象,不会丢失最开始的时间
- 线程安全
- 能精确到毫秒、纳秒
4.2 LocalDate、LocalTime、LocalDateTime
- LocalDate:代表本地日期(年、月、日、星期)
- LocalTime:代表本地时间(时、分、秒、纳秒)
- LocalDateTime:代表本地日期、时间(年、月、日、星期、时、分、秒、纳秒)
获取对象的方案:
方法名 | 示例 |
---|
public static Xxx now() :获取系统当前时间对应的该对象 | LocalDate ld = LocalDate.now();
LocalTime lt = LocalTime.now();
LocalDateTime ldt = LocalDateTime.nou(); |
public static Xxx of(...) :获取指定时间的对象 | LocalDate ld = LocalDate.of(2099, 11, 11);
LocalTime lt = LocalTime.of(9, 8, 59);
LocalDateTime ldt = LocalDateTime.of(2025, 11, 16, 14, 30, 01); |
4.2.1 LocalDate
方法名 | 说明 |
---|
public int getYear() | 获取年 |
public int getMonthValue() | 获取月份(1~12) |
public int getDayOfMonth() | 获取日 |
public int getDayOfYear() | 获取当前是一年中的第几天 |
public DayOfWeek getDayOfWeek() | 获取星期几:ld.getDayOfWeek().getValue() |
此外:
方法名 | 说明 |
---|
withYear 、withMonth 、withDayOfMonth 、withDayOfYear | 直接修改某个信息,返回新日期对象 |
plusYears 、plusMonths 、plusDays 、plusWeeks | 把某个信息加多少,返回新日期对象 |
minusYears 、minusMonths 、minusDays 、minusWeeks | 把某个信息减多少,返回新日期对象 |
equals 、isBefore 、isAfter | 判断两个日期对象是否相等、在前还是在后 |
4.2.2 LocalTime
方法名 | 说明 |
---|
public int getHour() | 获取小时 |
public int getMinute() | 获取分 |
public int getSecond() | 获取秒 |
public int getNano() | 获取纳秒 |
此外:
方法名 | 说明 |
---|
withHour 、withMinute 、withSecond 、withNano | 修改时间,返回新时间对象 |
plusHours 、plusMinutes 、plusSeconds 、plusNanos | 把某个信息加多少,返回新时间对象 |
minusHours 、minusMinutes 、minusSeconds 、minusNanos | 把某个信息减多少,返回新时间对象 |
equals 、isBefore 、isAfter | 判断两个时间对象是否相等、在前还是在后 |
4.2.3 LocalDateTime
方法名 | 说明 |
---|
getYear 、getMonthValue 、getDayOfMonth 、getDayOfYear 、getDayOfWeek 、getHour 、getMinute 、getSecond 、getNano | 获取年月日、时分秒、纳秒等 |
withYear 、withMonth 、withDayOfMonth 、withDayOfYear 、withHour 、withMinute 、withSecond 、withNano | 修改某个信息,返回新日期时间对象 |
plusYears 、plusMonths 、plusDays 、plusWeeks 、plusHours 、plusMinutes 、plusSeconds 、plusNanos | 把某个信息加多少,返回新日期时间对象 |
minusYears 、minusMonths 、minusDays 、minusWeeks 、minusHours 、minusMinutes 、minusSeconds 、minusNanos | 把某个信息减多少,返回新日期时间对象 |
equals 、isBefore 、isAfter | 判断两个时间对象是否相等、在前还是在后 |
转换相关的API
方法名 | 说明 |
---|
public LocalDate toLocalDate() | 转换成一个LocalDate对象 |
public LocalTime toLocalTime() | 转换成一个LocalTime对象 |
4.3 时区与带时区的时间
- 中国标准时间 = 世界标准时间(UTC) + 8小时
4.3.1 ZoneId
方法名 | 说明 |
---|
public static Set<String> getAvailableZoneIds() | 获取Java中支持的所有时区 |
public static ZoneId systemDefault() | 获取系统默认时区 |
public static ZoneId of(String zoneId) | 获取一个指定时区 |
4.3.2 ZonedDateTime
方法名 | 说明 |
---|
public static ZonedDateTime now() | 获取当前时区的ZoneDateTime对象 |
public static ZonedDateTime now(ZoneId zone) | 获取指定时区的ZonedDateTime对象 |
getYear 、getMonthValue 、getDayOfMonth 、getDayOfYear 、getDayOfWeek 、getHour 、getMinute 、getSecond 、getNano | 获取年月日、时分秒、纳秒等 |
public ZonedDateTime withXxx(时间) | 修改时间系列的方法 |
public ZonedDateTime minusXxx(时间) | 减少使劲按系列的方法 |
public ZonedDateTime plusXxx(时间) | 增加时间系列的方法 |
4.4 Instant
- 时间线上的某个时刻/时间戳
- 通过获取Instant的对象可以拿到此刻的时间,该时间由两部分组成:从1970-01-01 00:00:00 开始走到此刻的总秒数 + 不够1秒的纳秒
- 作用:可以用来记录代码的执行时间,或用于记录用户操作某个事件的时间点
方法名 | 说明 |
---|
public static Instant now() | 获取当前时间的Instant对象(标准时间) |
public long getEpochSecond() | 获取从1970-01-01T00:00:00开始记录的秒数 |
public int getNano() | 从时间线开始,获取从第二个开始的纳秒数 |
plusMillis 、plusSeconds 、plusNanos | 增加系列的方法 |
minusMillis 、minusSeconds 、minusNanos | 减少时间系列的方法 |
equals 、isBefore 、isAfter | 判断时间系列的方法 |
4.5 DateTimeFormatter
方法名 | 说明 |
---|
public static DateTimeFormatter ofPattern(时间格式) | 获取格式化器对象 |
public String format(时间对象) | 格式化时间 |
方法名 | 说明 |
---|
public String format(DateTimeFormatter formatter) | 格式化时间 |
public static LocalDateTime pase(CharSequence text, DateTimeFormatter formatter) | 解析时间 |
4.6 Period和Duration
- Period:可以用于计算两个LocalDate对象相差的年数、月数、天
方法名 | 说明 |
---|
public static Period between(LocalDate start, LocalDate end) | 传入两个日期对象,得到Period对象 |
public int getYears() | 计算隔几年并返回 |
public int getMonths() | 计算隔几个月并返回 |
public int getDays() | 计算隔几天并返回 |
- Duration:可以用于计算两个时间对象相差的天数、小时数、分数、秒数、纳秒数;支持LocalTime、LocalDateTime、Instant等时间
方法名 | 说明 |
---|
public static Duration between(开始时间对象, 截止时间对象) | 传入两个时间对象,得到Duration对象 |
public long toDays() | 计算隔多少天并返回 |
public long toHours() | 计算隔多少小时并返回 |
public long toMinutes() | 计算隔多少分并返回 |
public long toSeconds() | 计算隔多少秒并返回 |
public long toMillis() | 计算隔多少毫秒并返回 |
public long toMillis() | 计算隔多少毫秒并返回 |
public long toNanos() | 计算隔多少纳秒并返回 |
5. Arrays
方法名 | 说明 |
---|
public static String toString(类型[] arr) | 返回数组的内容 |
public static int[] copyOfRange(类型[] arr, 起始索引, 结束索引) | 拷贝数组(指定范围) |
public static int[] copyOf(类型[] arr, int newLength) | 拷贝数组 |
public static setAll(double[] arr, IntToDoubleFunction generator) | 把数组中的原数据改为新数据 |
public static void sort(类型[] arr) | 对数组进行排序(默认是升序排序) |
-
如果数组中存储的是对象,如何进行排序?
-
方式一:让该对象的类实现Comparable(比较规则)接口,然后重写compareTo方法,自己来制定比较规则
-
方式二:使用下面这个sort方法,创建Comparator比较器接口的匿名内部类对象,然后自己制定比较规则
public static <T> void sort(T[] arr, Comparator<? super T> c)
6. JDK8新特性:Lambda表达式
6.1 Lambda概述
- Lambda表达式是JDK 8开始新增的一种语法形式
- 作用:用于简化匿名内部类的代码写法
- 注意:Lambda表达式只能简化函数式接口的匿名内部类
(被重写方法的形参列表) -> {
被重写方法的方法体代码
}
什么是函数式接口?
- 有且仅有一个抽象方法的接口
- 将来我们见到的大部分函数式接口,上面都可能会有一个 **
@FunctionalInterface
**的注解,有该注解的接口就必定是函数式接口
6.2 案例演示
// Lambda表达式简化setAll方法中匿名内部类
double[] scores = {99.8, 128.0, 100.0}
/*
// 简化前
Arrays.setAll(scores, new IntToDoubleFunction() {
@Override
public double applyAsDouble(int value) {
return scores[value] * 0.8
}
})
*/
// 简化后
Arrays.setAll(scores, (int value) -> {
return scores[value] * 0.8
})
System.out.println(Arrays.toString(scores))
// Lambda表达式简化Comparator接口的匿名形式
/*
// 简化前
Arrays.sort(students, new Comparator<Student>(){
@Override
public int compare(Student s1, Student s2) {
return s1.getAge() – s2.getAge();
}
});
*/
// 简化后
Arrays.sort(students, (Student s1, Student s2) ->{
return s1.getAge() – s2.getAge();
});
6.3 Lambda表达式的省略规则
- 参数类型可以省略不写
- 如果只有一个参数,参数类型可以省略,同时()也可以省略
- 如果Lambda表达式中的方法体代码只有一行代码,可以省略大括号不写,同时要省略分号!此时,如果这行代码是return语句,也必须去掉return不写
7. JDK8新特性:方法引用
7.1 静态方法的引用
- 类名::静态方法
- 如果某个Lambda表达式里只是调用一个静态方法,并且前后参数的形式一致,就可以使用静态方法引用
7.2 实例方法的引用
- 对象名::实例方法
- 如果某个Lambda表达式里只是调用一个实例方法,并且前后参数的形式一致,就可以使用实例方法引用
7.3 特定类型方法的引用
- 类型::方法
- 如果某个Lambda表达式里只是调用一个实例方法,并且前面参数列表中的第一个参数是作为方法的主调,后面的所有参数都是作为该实例方法的入参的,则此时就可以使用特定类型的方法引用
7.4 构造器引用
- 类名::new
- 如果某个Lambda表达式里只是在创建对象,并且前后参数情况一致,就可以使用构造器引用