【Java从入门到大牛】java.lang、java.util包下的常用API

本文由 程序喵正在路上 原创,CSDN首发!
系列专栏:Java从入门到大牛
首发时间:2023年7月22日
欢迎关注点赞收藏留言
一以贯之的努力 不得懈怠的人生

目录

  • Math、System、Runtime
  • BigDecimal
  • JDK8之前传统的日期、时间
    • Date
    • SimpleDateFormat
    • Calendar
  • JDK8开始新增的日期、时间
    • 为什么要学JDK8新增的时间 ?
    • LocalDate、LocalTime、LocalDateTime
    • Zoneld、ZonedDateTime
    • Instant
    • DateTimeFormatter
    • Period、Duration
  • Arrays
  • JDK8新特性:Lambda表达式
    • 认识Lambda表达式
    • Lambda表达式的省略规则
  • JDK8新特性:方法引用
    • 静态方法的引用
    • 实例方法的引用
    • 特定类型方法的引用
    • 构造器引用

Math、System、Runtime

什么是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

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);
    }
}

【Java从入门到大牛】java.lang、java.util包下的常用API_第1张图片

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

JDK8之前传统的日期、时间

Date

代表的是日期和时间

构造器 说明
public Date() 创建一个 Date 对象,代表的是系统当前此刻日期时间
public Date(long time) 把时间毫秒值转换成 Date 日期对象
常见方法 说明
public long getTime() 返回从 1970年1月1日 00:00:00 走到此刻的总毫秒数
public void setTime(long time) 设置日期对象的时间为当前时间毫秒值对应的时间

SimpleDateFormat

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

常见构造器 说明
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

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

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开始新增的日期、时间

为什么要学JDK8新增的时间 ?

JDK8之前传统的时间API

  1. 设计不合理,使用不方便,很多都被淘汰了
  2. 都是可变对象,修改后会丢失最开始的时间信息
  3. 线程不安全
  4. 只能精确到毫秒

JDK8开始之后新增的时间API

  1. 设计更合理,功能丰富,使用更方便
  2. 都是不可变对象,修改后会返回新的时间对象,不会丢失最开始的时间
  3. 线程安全
  4. 能精确到毫秒、纳秒

JDK8新增的时间,都是 java.time 包下的类

代替 Calendar

  • LocalDate:年、月、日
  • LocalTime:时、分、秒
  • LocalDateTime:年、月、日、时、分、秒
  • ZoneId:时区
  • ZonedDateTime:带时区的时间

代替 Date

  • Instant:时间戳 / 时间线

代替 SimpleDateFormat

  • DateTimeFormatter:用于时间的格式化和解析

其他补充

  • Duration:时间间隔(时、分、秒、纳秒)
  • Period:时间间隔(年、月、日)

LocalDate、LocalTime、LocalDateTime

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

获取对象的方案

方法名 实例
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 对象

Zoneld、ZonedDateTime

什么是时区 ?

由于世界各个国家与地区的经度不同,各地区的时间也有所不同,因此会划分为不同的时区

ZoneId:代表时区 Id

世界标准时间(UTC),中国标准时间为 UTC + 8 小时

ZoneId 时区的常见方法
【Java从入门到大牛】java.lang、java.util包下的常用API_第2张图片

ZonedDateTime 带时区时间的常见方法
【Java从入门到大牛】java.lang、java.util包下的常用API_第3张图片

Instant

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

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

    【Java从入门到大牛】java.lang、java.util包下的常用API_第4张图片

  • 作用:可以用来记录代码的执行时间,或用于记录用户操作某个时间的时间点

  • 传统的 Date 类,只能精确到毫秒,并且是可变对象

  • 新增的 Instant 类,可以精确到纳秒,并且是不可变对象,推荐用 Instant 代替 Date

DateTimeFormatter

【Java从入门到大牛】java.lang、java.util包下的常用API_第5张图片

LocalDateTime提供的格式化、解析时间的方法
【Java从入门到大牛】java.lang、java.util包下的常用API_第6张图片

Period、Duration

Period(一段时期)

可以用于计算两个 LocalDate 对象相差的年数、月数、天数
【Java从入门到大牛】java.lang、java.util包下的常用API_第7张图片

Duration(持续时间)

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

【Java从入门到大牛】java.lang、java.util包下的常用API_第8张图片

Arrays

什么是 Arrays?

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

Arrays类提供的常见方法

【Java从入门到大牛】java.lang、java.util包下的常用API_第9张图片

对数组中的数据进行排序

double[] prices = {99.8, 128, 100};
Arrays.sort(prices);
System.out.println(Arrays.toString(prices));

如果数组中存储的是对象,怎么排序 ?

  • 方法一:让该对象的类实现 Comparable(比较规则)的接口,然后重写 compareTo 方法,自己来制定比较规则
  • 方法二:使用下面这个 sort 方法,创建 Comparator 比较器接口的匿名内部类对象,然后自己制定比较规则
public static <T> void sort(T[] arr, Comparator<? super T> c)	// 对数组进行排序(支持自定义排序规则) 

自定义排序规则时,需要遵循的官方约定,升序规则如下。:

  • 如果认为左边对象 大于 右边对象 应该返回正整数
  • 如果认为左边对象 小于 右边对象 应该返回负整数
  • 如果认为左边对象 等于 右边对象 应该返回0整数

JDK8新特性:Lambda表达式

认识Lambda表达式

什么是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 表达式中的方法体代码只有一行代码,可以省略大括号不写,同时要省略分号。此时,如果这行代码是 return 语句,也必须去掉 return 不写

JDK8新特性:方法引用

静态方法的引用

格式

类名::静态方法

使用场景

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

实例方法的引用

格式

对象名::实例方法

使用场景

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

特定类型方法的引用

格式

类型::方法

使用场景

如果某个 Lambda 表达式里只是调用一个实例方法,并且前面参数列表中的第一个参数是作为方法的主调,后面的参数都是作为该实例方法的入参的,则此时就可以使用特定类型的方法引用

构造器引用

格式

类名::new

使用场景

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

你可能感兴趣的:(Java从入门到大牛,java,开发语言)