工具类


工具类

其构造方法是私有的,即无法实例化对象,其中有很多静态方法,可以通过 类名.方法名() 调用

数学工具类

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(原数组,起始索引,目的数组,起始索引,拷贝个数) 进行数组的拷贝

注:

  1. 如果原数组和目的数组都是基本数据类型,那么二者的类型必须保持一致,否则会报错
  2. 在拷贝的时候需要考虑数组的长度,如果超出范围也会报错
  3. 如果原数组和目的数组都是引用数据类型,那么子类类型可以赋值给父类类型
  • 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

方法:

  1. setTime(long time);
  2. long getTime(); 获取毫秒值
  • Calendar类

代表了系统当前时间的日历对象,可以单独修改、获取时间中的年、月、日

  1. 创建

注:

  • 是抽象类,不能 new ,要调用Calendar.getInstance()获取一个代表当前日期时间的实例。
    底层原理:会根据系统的不同时区来获取不同的日历对象,默认表示当前时间。会把时间中的纪元、年、月、日、时、分、秒、星期等都放到一个数组中
  • 月份范围: 0~11 分别表示1月到12月
  • 星期:星期日为一周的第一天
  1. 方法
  • 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类

  1. 作用
  • 格式化:把时间变成我们喜欢的格式
  • 解析:把字符串表示的时间变成Date对象
  1. 构造
  • 空参:使用默认格式(年/月/日 上/下午小时:分钟)
  • 含参(String pattern):使用指定格式
  1. 方法
  • String format(Date date) 格式化(日期对象 → 字符串)
  • Date parse(String source) 解析(字符串 → 日期对象)
  1. 使用
  • 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);

新的类中的对象均不可变

  1. 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(时间) 增加时间系列方法
  1. 日期格式化类SimpleDateFormat

DateTimeFormatter

用于时间的格式化和解析

  • static DateTimeFormatter ofPattern(格式) 获取格式对象
  • String format(时间对象) 按照指定方式格式化
  1. 日历类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对象
  1. 工具类

方法:

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 : 时间间隔(所有单位)


Author: havenochoice
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source havenochoice !
评论
  TOC