工具类
其构造方法是私有的,即无法实例化对象,其中有很多静态方法,可以通过 类名.方法名() 调用
数学工具类
即 Math 类(final,并且构造方法为私有),其中封装了很多常用的数学方法(都是 static)
- abs / absExact :求绝对值 (-2147483648会出错)
- pow(a,b):求a的b次方 (b = 0.5 → 开平方根
- sqrt:求算术平方根
- cbrt:求立方根
- min / max :求最小/最大值
- ceil / floor / round :向上/向下取整/四舍五入
- random:求 [0.0,1.0)的随机数
- sin / cos / tan / asin / acos / atan :三角函数
- log() / log10() :以e / 10为底求某数的对数
求以2为底4的对数:
double res = Math.log(4) / Math.log(2);
数组工具类
即 Arrays 类,其中针对数组类型有很多方法(基本都是静态方法)
- toString :打印数组 (多维数组:deepToString)
- sort (数组名,排序规则)
对数组进行从小到大排序
注:只能给引用数据类型的数组进行排序,如果数组是基本数据类型的,需要变成其对应的包装类
排序规则:是一个接口 Compare,所以在调用方法时,需要传递这个接口的实现类对象作为排序的规则。由于只需要使用一次,所以直接用匿名内部类形式就行了
底层原理:
利用插入排序 + 二分查找的方式进行排序
默认把0索引的数据当做是有序的序列,1索引到最后认为是无序的序列
遍历无序的序列得到里面的每一个元素,假设当前遍历得到的元素是A元素,则把A往有序序列中插入,插入时利用二分查找确定A元素的插入点
拿着A元素跟插入点的元素进行比较,比较的规则就是compare方法的方法体
如果方法的返回值是负数,则拿着A继续跟前面的数据进行比较
如果方法的返回值是正数 / 0,则拿着A继续跟后面的数据进行比较
直到能确定A的最终位置为止
从小到大 : o1 - o2
从大到小 : o2 - o1
- equals:判断两个数组的每个值是否相等 (多维数组:deepEquals)
- fill ( 数组名 , int value ):将一个数组用某个值填充
- copyOf ( 原数组 ,复制长度)
int[] arr = {1,2,3,4);
int[] copy = Arrays.copyOf(arr,4);
如果新数组的长度小于原数组,会部分拷贝
如果新数组的长度大于原数组,会补上默认初始值
- copyOfRange (数组名,起始下标,终止下标) 指定范围进行数组拷贝
注:包头不包尾,包左不包右 - (不是Arrays类的方法)System.arraycopy(用作复制数组名,起始下标,目标数组名,起始下标,复制长度)
int[] arr = {1,2,3,4);
int[] copy = new int[10];
System.arraycopy(arr,0,copy,2,4);//arr的内容将从copy下标为2开始复制4个
- int binarySearch(名,值):二分查找数组中的某个元素
如果存在,返回索引值
如果不存在,返回 - 插入点 - 1
System
提供了与系统相关的方法
- arraycopy(原数组,起始索引,目的数组,起始索引,拷贝个数) 进行数组的拷贝
注:
- 如果原数组和目的数组都是基本数据类型,那么二者的类型必须保持一致,否则会报错
- 在拷贝的时候需要考虑数组的长度,如果超出范围也会报错
- 如果原数组和目的数组都是引用数据类型,那么子类类型可以赋值给父类类型
exit ( int status) 终止当前运行的Java虚拟机
status:
- 0 :正常停止
- 非0:异常停止
long currentTimeMillis( ) 返回当前系统的时间毫秒值形式
计算机中的时间原点
1970-1-1 00:00:00
1秒 = 1000毫秒
1毫秒 = 1000微秒
1微秒 = 1000纳秒
Runtime
表示当前虚拟机的运行环境
- Runtime getRuntime( ) 创建一个当前系统的运行环境对象(只有一个)
- exit (int status) 停止虚拟机(System中调用的也是这个方法)
- int availableProcessors( ) 获得CPU的线程数
- long maxMemory( ) JVM能从系统中获取的总内存大小(单位byte)
- long totalMemoty( ) JVM已经从系统中获取的总内存大小(单位byte)
- long freeMemory( ) JVM剩余内存大小(单位byte)
- Process exec(String command) 运行cmd命令
日期相关类
在计算机中,日期一般以时间戳的形式存在,是自1970年1月1日00:00:00(UTC时间)起到某一时刻的毫秒数。比如按照毫秒进行计时,当时间戳为1000时,就表示时间为1970年1月1日00:00:01这个时间。
旧
- Date类
Date date1 = new Date();//不写参数默认为当前的时间
sout(date);
Date date2 = new Date(1000L); //由于有参构造中参数(毫秒)类型为long,所以要写L
方法:
- setTime(long time);
- long getTime(); 获取毫秒值
- Calendar类
代表了系统当前时间的日历对象,可以单独修改、获取时间中的年、月、日
- 创建
注:
- 是抽象类,不能
new,要调用Calendar.getInstance()获取一个代表当前日期时间的实例。
底层原理:会根据系统的不同时区来获取不同的日历对象,默认表示当前时间。会把时间中的纪元、年、月、日、时、分、秒、星期等都放到一个数组中 - 月份范围: 0~11 分别表示1月到12月
- 星期:星期日为一周的第一天
- 方法
- Date getTime() 获取日期对象
- setTime(Date date) 给日历设置日期对象
- long getTimeInMillis() 获取时间毫秒值
- setTimeInMillis(long millis) 给日历设置时间毫秒值
- int get(int field) 取日历中的某个字段信息
- set(int field,int value) 修改日历的某个字段信息
- add(int field,int amout) 为某个字段增加/减少(amount为负数)指定的值
Calendar类中,数组各索引对应的数字都被定义为了常量(年:YEAR 月:MONTH 日期:DAY_OF_MONTH等)
例如:为一个日期对象设置年为2024
calendar.set(Calendar.YEAR, 2024);
提取日期和时间
int year = calendar.get(Calendar.YEAR);
- DateFormat类
可以实现字符串和日期的相互转换。由于其定义是一个抽象类无法直接使用,其常用的子类是SimpleDateFormat,通过配置能实现各种各样的日期转换
SimpleDateFormat类
- 作用
- 格式化:把时间变成我们喜欢的格式
- 解析:把字符串表示的时间变成Date对象
- 构造
- 空参:使用默认格式(年/月/日 上/下午小时:分钟)
- 含参(String pattern):使用指定格式
- 方法
- String format(Date date) 格式化(日期对象 → 字符串)
- Date parse(String source) 解析(字符串 → 日期对象)
- 使用
- format
Date d = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String s = sdf.format(d);
sout(s);
- parse
String s1 = "2025-09-01 08:00:00";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d1 = sdf.parse(s1);
System.out.println(d1);
新

新的类中的对象均不可变
- Date类
a. ZoneId 时区
方法:
- static Set
getAvailableZoneIds() 获取Java中支持的所有时区(600个) - static ZoneId systemDefault() 获取系统默认时区
- static ZoneId of(String zoneId) 获取一个指定时区
b. Instant 时间戳
表示时间线上的一个点,通常用来表示时间戳,打印结果与 LocalDateTime 在UTC+0的结果相同,相当于一个砍掉所有功能只用于保存时间的LocalDateTime对象
- static Instant now() 获取当前时间的Instant对象(标准时间)
Instant instant = Instant.now();
- static Instant ofXXX(long epochMilli) 根据(秒/毫秒/纳秒/)获取Instant对象
- ZonedDateTime atZone(ZoneId zone) 指定时区
- boolean isXxx(Instant otherInstant) 判断系列方法
- Instant minusXxx( long ) 减少时间系列方法
- Instant plusXxx( long ) 增加时间系列方法
c. ZonedDateTime 带时区的时间
- static ZonedDateTime now() 获取当前时间的ZonedDateTime对象
- static ZonedDateTime ofXxx() 获取指定时间的ZonedDateTime对象
- ZonedDateTime withXxx(时间) 修改时间系列方法
- ZonedDateTime minusXxx(时间) 减少时间系列方法
- ZonedDateTime plusXxx(时间) 增加时间系列方法
- 日期格式化类SimpleDateFormat
DateTimeFormatter
用于时间的格式化和解析
- static DateTimeFormatter ofPattern(格式) 获取格式对象
- String format(时间对象) 按照指定方式格式化
- 日历类Calendar
a. LocalDate: 年、月、日
静态方法
- now : 创建当前日期的对象
LocalDate date = LocalDate.now();
- of ( year ,month ,date) : 创建某个年-月-日的日期对象
- ofYearDay(year , day) : 创建某一年第几天的对象
成员方法
- getYear / getMonth / getDayOfMonth : 得到对象的年,月(不是数字),日
- getMonthValue : 得到月份数字
- getDayOfWeek :得到这周的第几天
- getDayOfYear : 得到这年的第几天
- plusDays / plusWeeks / plusMonths / plusYears :在原基础上增加几天,周,月,年
- minusDays / …… :减去
- withYear / withMonth / withDayOfMonth : 更改原对象的年,月,日
- atTime : 补齐时间
- isLeapYear:判断是否为闰年
b. LocalTime: 时、分、秒
也就是能表示当前时间的日期类(不包括年月日),并且能精确表示到纳秒(10e-9秒)
方法和LocalDate差不多
- now : 创建当前时间的对象
- of ( hour ,minute ,second,纳秒): 创建某个时-分-秒-纳秒的日期对象(hour和minute必写,之后可以不写,默认为0)
- getHour / getMinute / getSecond / getNano: 得到时,分,秒,纳秒
- plusHour / minusHour / ……. :增加或减去多少时,分,秒
- atDate : 补齐日期
c. LocalDateTime: 年、月、日、时、分、秒
- LocalDate toLocalDate() 转化为一个LocalDate对象
- LocalTime toLocalTime() 转化为一个LocalTime对象
- 工具类
方法:
between(静态)
a. Period : 时间间隔(年、月、日)(注意月是在同一年内计算,天是在同一月内计算)
Period period = Period.ofDays(1); //表示相差时间1天
Period period = Period.between(LocalDate.now(),LocalDate.now().plusDays(1));
//注意这里使用的是LocalDate
System.out.println(period.getDays());
b. Duration : 时间间隔(秒、纳秒)
//通过between来计算两个时间的差值
Duration duration = Duration.between(LocalDateTime.now(),LocalDateTime.now().plusMinutes(10));
System.out.println(duration.getSeconds()); //此处得到的是秒
Duration duration = Duration.ofSeconds(1); //表示相差时间1秒
c. ChornoUnit : 时间间隔(所有单位)