常用API二

Math、System、Runtime

Math

  • 代表数学,是一个工具类,里面提供的都是对数据进行操作的一些静态方法。

常见方法

Math类常见方法

System

  • System代表程序所在的系统,也是一个工具类。

常见方法

System类常见方法

  • 时间毫秒值:指的是从1970年1月1日00:00:00走到此刻的总的毫秒数,应该是很大的。1s=1000ms。
  • 可以用于计算程序运算时间

Runtime

  • 代表程序所在的运行环境。
  • Runtime是一个单例类。

常见方法

Runtime类常见方法

BigDecimal

简介

  • 用于解决浮点型运算时,出现结果失真的问题,

常见构造器、常用方法

BigDecimal类常见方法

  • BigDecimal一定要得到一个精确结果
1
2
3
4
5
6
BigDecimal a = BigDecimal.valueOf(0.1);  //禁止直接将Double转化为Bigdecimal 会带来误差
BigDecimal b = BigDecimal.valueOf(0.3);
//无法整除时 要设置 小数精度 和 舍入方法
BigDecimal c = i.divide(j, 2, RoundingMode.HALF_UP); //保留2位小数 采取四舍五入
//小技巧:Ctrl + Alt + Space 智能填补代码
System.out.println(c); //0.33

JDK8之前传统的日期、时间

Date

  • 代表的是系统的日期和时间。

常见构造器、常见方法

Date类常见方法

SimpleDateFormat

  • 代表简单日期格式化,可以用来把日期对象、时间毫秒值格式化成我们想要的形式。

常见构造器、常见方法

SimpleDateFormat类常见方法

时间格式化常见符号

时间格式化常见符号

1
2
3
4
5
6
Date d = new Date();  //系统时间
long time = d.getTime(); //时间毫秒值
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss EEE a");
String rs = sdf.format(d);
String rs = sdf.format(time);
//二者输出相同,如:2025年05月13日 11:00:00 周二 上午

解析字符串时间成为日期对象

字符串转日期

1
2
3
4
5
String dateStr = "2025-05-13 11:25:00";
//要想把字符串对象转换为时间 需要创建一个格式相同的简单日期格式化对象
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d2 = sdf2.parse(dateStr); //此处要Alt + Enter抛出一个异常
//Tue May 13 11:25:00 2025

Calender

  • 代表的是系统此刻时间对应的日历。通过它可以单独获取、修改时间中的年、月、日、时、分、秒等。

常见方法

Calender类常见方法

  • 注意:calendar是可变对象,一旦修改后其对象本身表示的时间将产生变化。

JDK8开始新增的日期、时间

新旧对比

  • JDK8新增的时间
    • LocalDate:年、月、日
    • LocalTime:时、分、秒
    • LocalDateTime:年、月、日 时、分、秒
    • ZoneId:时区
    • ZonedDateTime:带时区的时间
    • Instant:时间戳/时间线
    • DateTimeFormatter:用于时间的格式化和解析
    • Duration:时间间隔(时、分、秒、纳秒)
    • Period:时间间隔(年,月,日)

小结

LocalDate、LocalTime、LocalDateTime

  • LocalDate:代表本地日期(年、月、日、星期)
  • NLocalTime:代表本地时间(时、分、秒、纳秒)
  • LocalDateTime:代表本地日期、时间(年、月、日、星期、时、分、秒、纳秒)

获取对象的方案

获取对象的形式

  • LocalDate的常用API(都是处理年、月、日、星期相关的)

LocalDate的常见方法

  • LocalTime的常用API(都是处理时、分、秒、纳秒相关的)

LocalTime的常见方法

  • LocalDateTime的常用API(可以处理年、月、日、星期、时、分、秒、纳秒等信息)

localDateTime的常见方法

ZoneID

  • 代表时区ID

    • 洲名/城市名:Asia/Shanghai、Asia/Chongqing
    • 国家名/城市名:America/New York
  • 我国的时区:东8区

时区

常见方法

ZoneDateTime常见方法

Instant

  • Instant 时间线上的某个时刻/时间戳。

  • 通过获取Instant的对象可以拿到此刻的时间,该时间由两部分组成:从1970-01-01 00:00:00 开始走到此刻的总秒数+不够1秒的纳秒数。

常见方法

Instant常见方法

  • 作用:可以用来记录代码的执行时间,或用于记录用户操作某个事件的时间点。(精确到纳秒)
  • 传统的Date类,只能精确到毫秒,并且是可变对象。
  • 新增的Instant类,可以精确到纳秒,并且是不可变对象,推荐用Instant代替Date。

DateTimeFormatter

  • SimpleDateFormat是线程 不安全 的,而DateTimeFormatter是线程 安全

常见方法

dateTimeFormatter常见方法

LocalDateTime提供的格式化、解析时间的方法

解析时间

Period(一段时期)

  • 可以用于计算两个 LocalDate对象 相差的年数、月数、天数。

常见方法

Period常见方法

Duration(持续时间)

  • 可以用于计算两个时间对象相差的天数、小时数、分数、秒数、纳秒数;支持LocalTime.、LocalDateTime、Instant等时间。

常见方法

Duration常见方法

Arrays

简介

  • 用来操作数组的一个工具类

常见方法

Arrays常见方法

如何对对象数组进行排序

  • 方式一:让该对象的类实现Comparable(比较规则)接口,然后重写compareTo方法,自己来制定比较规则。

    • 实现Comparable<泛型 >接口,重写compareTo方法。

    重写compareTo方法

  • 方式二:使用下面这个sort方法,创建Comparator比较器接口的 匿名内部类 对象,然后自己制定比较规则。

public static void sort(T[] arr, Comparator<? super T> c) 对数组进行排序(支持自定义排序规则)

Comparator匿名内部类

JDK8新特性:Lamnda表达式

认识Lamnda表达式

  • Lambda表达式是JDK8开始新增的一种语法形式,用于 简化匿名内部类 的代码写法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
(被重写方法的形参列表)->{
被重写方法的方法体代码
}

//匿名内部类(繁琐)
Class name = new Class(){
@Override
void swim(){
重写方法体
}
}

//Lambda表达式(简洁)
Class name = () ->{
重写方法体
}

//函数式接口:有且仅有一个抽象方法的接口
interface Class{
void method();
}
  • 注意:Lambda表达式只能简化函数式接口的匿名内部类!!
  • 什么是函数式接口?
    • 有且仅有一个抽象方法的接口。
    • 将来我们见到的大部分函数式接口,上面都可能会有@FunctionalInterface的注解,有该注解的接口就必定是函数式接口。

Lambda表达式的省略规则

  • Lambda表达式的省略写法(进一步简化Lambda表达式的写法)
    • 参数类型可以省略不写。
    • 如果只有一个参数,参数类型可以省略,同时()也可以省略。
    • 如果Lambda表达式中的方法体代码只有一行代码,可以省略大括号不写,同时要省略分号!此时,如果这行代码是return语句,也必须去掉return不写。

JDK8新特性:方法引用

  • 方法引用的标志性符号“ :: ”。
1
2
3
4
public class Student{
String name;
int age;
}
1
2
3
4
5
6
7
//原始写法:对数组中的学生对象,按照年龄升序排序
Arrays.sort(students, new Comparator<Student>(){
@Override
public int compare(Student o1, Student o2){
return o1.getAge() - o2.getAge(); //按照年龄升序
}
});
1
2
//Lambda写法
Arrays.sort(students, (o1, o2) -> o1.getAge() - o2.getAge());

静态方法的引用

  • 类名::静态方法

  • 如果某个Lambda表达式里只是调用一个静态方法,并且 前后参数的形式一致 ,就可以使用静态方法引用。

1
2
3
4
5
6
7
8
9
10
11
12
13
//Lambda写法
Arrays.sort(students, (o1, o2) -> o1.getAge() - o2.getAge());

//工具类
public class CompareByData{
//静态方法
public static int compareByAge(Student o1, Student o2){
return o1.getAge() - o2.getAge();
}
}

//静态方法引用写法(类名:静态方法名)
Arrays.sort(students, CompareBydata::compareByAge);

实例方法的引用

  • 对象名::实例方法
  • 如果某个Lambda表达式里只是调用一个实例方法,并且 前后参数的形式一致 ,就可以使用实例方法引用。
1
2
3
4
5
6
7
8
9
public class CompareByData{
public int compareByAgeDesc(Student o1, Student o2){
return o1.getAge() - o2.getAge();
}
}

//实例方法引用写法(对象名:实例方法名)
CompareByData compare = new CompareByData();
Arrays.sort(students, compare::compareByAgeDesc);

特定类型方法的引用

  • 类型::方法
  • 如果某个Lambda表达式里只是调用一个实例方法,并且前面参数列表中的第一个参数是作为方法的主调,后面的所有参数都是作为该实例方法的入参的,则此时就可以使用特定类型的方法引用。
1
2
3
4
5
6
7
8
9
String[] names = {"Ab", "bc", "Bd", "aa"};

//默认排序:按照ASCII码从小到大
Arrays.sort(names); //{"Ab", "Bd", "aa", "bc"}

//lambda表达式
Array.sort(names, (o1, o2) -> o1.compareToIgnoreCase(o2)); //compareToIgnoreCase()忽略大小写的比较方法
//特定类型方法引用写法(调用该方法的对象的类名:实例方法名)
Array.sort(name, String::compareToIgnoreCase)

构造器引用

  • 类名::new
  • 如果某个Lambda表达式里只是在创建对象,并且前后参数情况一致,就可以使构造器引用。