本文由 程序喵正在路上 原创,CSDN首发!
系列专栏:Java从入门到大牛
首发时间:2023年7月22日
欢迎关注点赞收藏留言
一以贯之的努力 不得懈怠的人生
什么是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) |
什么是System
System 代表程序所在的系统,也是一个工具类
System类提供的常见方法
方法名 | 说明 |
---|---|
public static void exit(int status) |
终止当前运行的 Java 虚拟机 |
public static long currentTimeMillis() |
返回当前系统的时间毫秒值形式 |
什么是时间毫秒值
指的是从 1970年1月1日 00::00:00 走到此刻的总毫秒数,应该是很大的
为什么选择 “1970年1月1日 00::00:00” 作为时间的起点?
1969年8月,贝尔实验室的程序员肯汤普逊利用妻儿离开一个月的机会,开始着手创造一个全新的革命性的操作系统,他使用 B 编译语言在老旧的 PDP-7 机器上开发出了 Unix 的一个版本。随后,汤普逊和同事丹尼斯里奇改进了 B 语言,开发出了 C 语言,重写了 UNIX。所以,1970年1月1日 可以算是 C 语言的生日
什么是Runtime
代表程序所在的运行环境,Runtime 是一个单例类
Runtime类提供的常见方法
方法名 | 说明 |
---|---|
public static Runtime getRuntime() |
返回与当前 Java 应用程序关联的运行时对象 |
public void exit(int status) |
终止当前运行的虚拟机 |
public int availableProcessors() |
返回 Java 虚拟机可用的处理器数 |
public long totalMemory() |
返回 Java 虚拟机中的内存总量 |
public long freeMemory() |
返回虚拟机中的可用内存 |
public Process exec(String command) |
启动某个程序,并返回代表程序的对象 |
BigDecimal的作用
用于解决浮点数运算时,出现结果失真的问题
结果失真
public class Test {
public static void main(String[] args) {
System.out.println(0.1 + 0.2);
System.out.println(1.0 - 0.32);
System.out.println(1.015 * 100);
System.out.println(1.301 / 100);
}
}
BigDecimal的常见构造器和常用方法
构造器 | 说明 |
---|---|
public BigDecimal(double val) |
将 double 转换为 BigDecimal,不推荐使用这个 |
public BigDecimal(String val) |
把 String 转成 BigDecimal |
方法名 | 说明 |
---|---|
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 |
代表的是日期和时间
构造器 | 说明 |
---|---|
public Date() |
创建一个 Date 对象,代表的是系统当前此刻日期时间 |
public Date(long time) |
把时间毫秒值转换成 Date 日期对象 |
常见方法 | 说明 |
---|---|
public long getTime() |
返回从 1970年1月1日 00:00:00 走到此刻的总毫秒数 |
public void setTime(long time) |
设置日期对象的时间为当前时间毫秒值对应的时间 |
代表简单日期格式化,可以用来把日期对象、时间毫秒值格式化成我们想要的形式
常见构造器 | 说明 |
---|---|
public SimpleDateFormat(String pattern) |
创建简单日期格式化对象,并封装时间的格式 |
格式化时间的方法 | 说明 |
---|---|
public final String format(Date date) |
将日期格式化成日期 / 时间字符串 |
public final String format(Object time) |
将时间毫秒值化成日期 / 时间字符串 |
时间格式的常见符号
符号 | 说明 |
---|---|
y | 年 |
M | 月 |
d | 日 |
H | 时 |
m | 分 |
s | 秒 |
EEE | 星期几 |
a | 上午/下午 |
yyyy-MM-dd HH:mm:ss | 2023-07-20 00:00:00 |
yyyy年MM月dd日 HH:mm:ss | 2023年07月20日 00:00:00 |
SimpleDateFormat解析字符串时间成为日期对象
2023-07-20 00:00:00 → \rightarrow → Date日期对象 ?
解析方法 | 说明 |
---|---|
public Date parse(String source) | 把字符串时间解析成日期对象 |
Calendar日历类的常见方法
方法名 | 说明 |
---|---|
public static Calendar 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) |
为某个信息增加 / 减少指定的值 |
注意:Calendar 是可变对象,一旦修改后其对象本身表示的时间将产生变化
JDK8之前传统的时间API
JDK8开始之后新增的时间API
JDK8新增的时间,都是 java.time 包下的类
代替 Calendar
代替 Date
代替 SimpleDateFormat
其他补充
获取对象的方案
方法名 | 实例 |
---|---|
public static Xxxx now() :获取系统当前时间对象的该对象 |
LocalDate Id = LocalDate.now(); |
\quad | LocalTime It = LocalTime.now(); |
\quad | LocalDateTime Idt = LocalDateTime .now(); |
public static Xxxx of(...) :获取指定时间的对象 |
LocalDate localDatel = LocalDate.of(2099, 11, 11); |
\quad | LocalTime localTimel = LocalTime.of(9, 8, 59); |
\quad | LocalDateTime localDateTimel = LocalDateTime.of(2025, 11, 16, 14, 30, 01); |
LocalDate的常用API(都是处理年、月、日、星期相关的)
方法名 | 说明 |
---|---|
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 | 判断两个日期对象是否相等,在前还是在后 |
LocalDateTime的常用API(可以处理年、月、日、星期、时、分、秒、纳秒等信息)
方法名 | 说明 |
---|---|
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 | 判断两个日期对象是否相等,在前还是在后 |
LocalDateTime转换成LocalDate、LocalTime的API
方法名 | 说明 |
---|---|
public LocalDate toLocalDate() |
转换成一个 LocalDate 对象 |
public LocalTime toLocalTime() |
转换成一个 LocalTime 对象 |
什么是时区 ?
由于世界各个国家与地区的经度不同,各地区的时间也有所不同,因此会划分为不同的时区
ZoneId:代表时区 Id
世界标准时间(UTC),中国标准时间为 UTC + 8 小时
Instant 时间线上的某个时刻/时间戳
通过获取 Instant 的对象可以拿到此刻的时间,该时间由两部分组成:从 1970-01-01 00:00:00 开始走到此刻的总秒数 + 不够 1 秒的纳秒数
作用:可以用来记录代码的执行时间,或用于记录用户操作某个时间的时间点
传统的 Date 类,只能精确到毫秒,并且是可变对象
新增的 Instant 类,可以精确到纳秒,并且是不可变对象,推荐用 Instant 代替 Date
Period(一段时期)
可以用于计算两个 LocalDate 对象相差的年数、月数、天数
Duration(持续时间)
可以用于计算两个时间对象相差的天数、小时数、分数、秒数、纳秒数;支持 LocalTime、LocalDateTime、Instant 等时间
什么是 Arrays?
用来操作数组的一个工具类
Arrays类提供的常见方法
对数组中的数据进行排序
double[] prices = {99.8, 128, 100};
Arrays.sort(prices);
System.out.println(Arrays.toString(prices));
如果数组中存储的是对象,怎么排序 ?
public static <T> void sort(T[] arr, Comparator<? super T> c) // 对数组进行排序(支持自定义排序规则)
自定义排序规则时,需要遵循的官方约定,升序规则如下。:
什么是Lambda表达式 ?
Lambda 表达式是 JDK 8 开始新增的一种语法格式,作用:用于简化匿名内部类的代码写法
格式
(被重写方法的形参列表) -> {
被重写方法的方法体代码
}
注意:Lambda 表达式只能简化函数式接口的匿名内部类
什么是函数式接口 ?
@FunctionalInterface
的注解,有该注解的接口必定是函数式接口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;
}
});
System.out.println(Arrays.toString(scores));
// Lambda表达式
Arrays.setAll(scores, (int value) -> {
return scores[value] * 0.8;
});
Lambda表达式简化Comparator接口的匿名形式
public static void main(String[] args) {
...
Arrays.sort(students, new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
return s1.getAge() - s2.getAge();
}
});
...
}
// Lambda表达式
Arrays.sort(students, (Student s1, Student s2) -> {
return s1.getAge() - s2.getAge();
});
Lambda 表达式的省略写法(进一步简化 Lambda 表达式的写法)
格式
类名::静态方法
使用场景
如果某个 Lambda 表达式里只是调用一个静态方法,并且前后参数的形式一致,就可以使用静态方法引用
格式
对象名::实例方法
使用场景
如果某个 Lambda 表达式里只是调用一个实例方法,并且前后参数的形式一致,就可以使用实例方法引用
格式
类型::方法
使用场景
如果某个 Lambda 表达式里只是调用一个实例方法,并且前面参数列表中的第一个参数是作为方法的主调,后面的参数都是作为该实例方法的入参的,则此时就可以使用特定类型的方法引用
格式
类名::new
使用场景
如果某个 Lambda 表达式里只是在创建对象,并且前后参数情况一致,就可以使用构造器引用