常用工具类

程序开发经常需要一些算法,例如提取当前系统日期、生成不重复的随机数字、对数字和日期的格式化输出、还有一些数学函数的运算等,这些都是程序开发中不可避免要使用的技术。这里介绍一些常用的工具类。

1.Date类
Date类用于表示日期时间,它位于java.util包中。
①创建Date类的对象
Date类最简单的构造方法就是默认的无参数的Date()构造方法public Date()
它使用系统中当前日期和时间创建并初始化Date类的实例对象。例,Date now=new Date(); Date类的另一个构造方法是public Date(long date)
这个构造方法接收一个long类型的整数来初始化Date对象,这个long类型的整数是标准基准时间(称为“历元(epoch)”,即1970年1月1日00:00:00)开始的毫秒数。很多和日期时间有关的类都能够转换为long类型整数。System类的currentTimeMillis()方法可以获取系统当前时间距历元的毫秒数。例,

long timeMillis=System.currentTimeMillis();   //系统当前时间距历元的毫秒数
Date date =new Date(timeMillis);   //系统当前时间
Date date2=new Date();    //系统当前时间

②比较Date对象
after方法:
该方法用于测试此日期对象是否在指定日期之后。
public boolean after(Date when)
参数说明:when是要比较的日期对象。当且仅当此Date对象表示的时间比when表示的时间晚,才返回true;否则返回false。

before方法:
该方法用于测试此日期对象是否在指定日期之前,它和after()方法正好相反。
public boolean before(Date when)
参数说明:when是要比较的日期对象。当此Date对象表示的时间比when表示的时间早,才返回true;否则返回false。

compareTo方法:
该方法用于比较两个日期对象的顺序,该方法常用于多个Date对象的排序。
public int compareTo(Date anotherDate)
参数说明:anotherDate是要比较的其他日期对象。
如果参数anotherDate表示的时间等于当前Date对象表示的时间,该方法返回值为0;如果当前Date对象表示的时间在anotherDate参数表示的时间之前,则返回小于0的值;如果当前Date对象在anotherDate参数表示的时间之后,则返回大于0的值。

③更改Date对象
getTime()方法:
getTime()方法返回自1970年1月1日00:00:00 GMT以来,此Date对象表示的毫秒数。
public long getTime() ==
System.currentTimeMillis()

Date dt=new Date();
System.out.println(dt.getTime());    //1599011671492
System.out.println(System.currentTimeMillis());   //1599011671492

setTime方法:
setTime()方法用于设置此Date对象,以表示1970年1月1日00:00:00 GMT以后time毫秒的时间点。
public void setTime(long time) ==
public Date(long date)

参数说明:time是毫秒数。例,

System.out.println(new Date(1546256));   //Thu Jan 01 08:25:46 CST 1970
Date dt=new Date();
dt.setTime(1546256);
System.out.println(dt);   //Thu Jan 01 08:25:46 CST 1970

④日期的格式化输出
在应用程序设计中,经常会需要显示时间和日期。String类的静态format()方法通过特殊转义符作为参数可以实现对日期和时间的格式化。format()方法用于创建格式化的字符串。它有两种重载形式。
public static String format(String format,Object… args)
参数说明:format是格式字符串。args是格式字符串中由格式说明符引用的参数。如果还有格式说明符以外的参数,则忽略这些额外的参数。参数的数目是可变的,可以为0。该方法使用指定的格式字符串和参数返回一个格式化字符串。格式化后的新字符串使用本地默认的语言环境。

public static String format(Locale l,String format,Object… args)
参数说明:local是格式化过程中要应用的语言环境。如果l为null,则不进行本地化。format是格式字符串。args是格式字符串中由格式说明符引用的参数。如果还有格式说明符以外的参数,则忽略这些额外的参数。参数的数目是可变的,可以为0。

日期格式化:
对于日期的格式化,可以使用转义符,把Date类的实例对象格式化。例,返回年月日中的月:

Date date=new Date();
String day=String.format("%tb", date);  //七月

“%tb”是转换符,常用的日期和时间的格式转换符:

Java 工具类介绍 java工具类说明_System

时间格式化:

使用format()方法不但可以完成日期的格式化,也可实现时间的格式化。时间格式化转换符要比日期转换符种类要更多、更精确。它可以将时间格式化成时、分、秒、毫秒,格式化时间的转换符:

Java 工具类介绍 java工具类说明_Java 工具类介绍_02


格式化常见的日期时间组合:

格式化日期与时间的转换符定义了各种格式日期字符串的方式,其中最常用的日期和时间的组合格式:

Java 工具类介绍 java工具类说明_编程语言_03

Date dt=new Date(1546256);
System.out.println(String.format("%tF", dt));   //1970-01-01

2.SimpleDateFormat类
①概述
java.text包下的类,实现了抽象类DateFormat类。它是用与语言环境有关的方式来格式化和解析日期的具体类。格式化:Date --> String   解析:String --> Date

②构造方法

public SimpleDateFormat()   默认模式
public SimpleDateFormat(String pattern)   给定模式

给定模式标准:

Java 工具类介绍 java工具类说明_System_04


Java 工具类介绍 java工具类说明_java_05

③常用方法(都是DateFormat类的方法)
public final String format(Date date)
public Date parse(String source) throws ParseException

format方法是对日期进行格式化,当构造方法是无参的时,格式化的输出与系统环境有关,当是有参的时,输出与给定模式有关;parse方法是对字符串进行解析,解析时字符串的格式要符合该构造方法的给定模式。例,

Date d=new Date();
SimpleDateFormat sdf=new SimpleDateFormat();
System.out.println(sdf.format(d));   //20-9-2 上午11:48
SimpleDateFormat sdf2=new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
System.out.println(sdf2.format(d));  //2020/09/02 11:48:48
System.out.println(sdf.parse("18-3-5 上午13:43"));   //Mon Mar 05 13:43:00 CST 2018
System.out.println(sdf2.parse("2019/05/03 13:45:12"));   //Fri May 03 13:45:12 CST 2019

3.Calendar类
①概述
java.util包下的类。它是抽象类,它为某个时间与一组日历字段(例如年、月、日、时、分、秒)之间的转换提供了一些方法,并为操作日历字段提供了一些方法。此处的日历字段通常使用类中的常量。它与Date类的区别在于:Date类将日期作为整体来操作,Calendar类将日期分成各个日历字段来操作。

②常量(日历字段)
public static final int YEAR 年
public static final int MONTH 月
public static final int DAY_OF_MONTH 本月天数
public static final int DATE 本月天数
public static final int DAY_OF_YEAR 本年天数
public static final int DAY_OF_WEEK 本周天名

注:月从0开始,即一月为0。本周天名从周日开始。具体介绍请看API

③常用方法
public int get(int field)
public static Calendar getInstance()
public abstract void add(int field,int amount)
public final void set(int year,int month,int date)

get方法的参数为日历字段;由于Calendar类没有构造方法,所以在创建对象时要使用子类对象,getInstance方法就返回了一个Calendar变量,实际返回的是子类的对象,此处使用了多态;add方法可以为指定的日历字段添加或减去(参数为负数即可)指定的数字;set方法可以设置指定的日期。

Calendar c=Calendar.getInstance();
System.out.println(c.get(Calendar.YEAR));   //2020
System.out.println(c.get(Calendar.MONTH));   //8
System.out.println(c.get(c.DAY_OF_WEEK));    //4(周三)
c.add(Calendar.YEAR,-15);
System.out.println(c.get(c.YEAR));   //2005
c.add(Calendar.MONTH,5);
System.out.println(c.get(Calendar.MONTH));   //1(2月)
c.set(2008, 8, 1);
System.out.println(c.get(c.YEAR));   //2008
System.out.println(c.get(c.MONTH));   //8
System.out.println(c.get(c.DAY_OF_MONTH));   //1

注:set方法中的月也应该符合日历字段规则,即0为1月。

4.数学运算
在Java语言中提供了一个执行数学基本运算的Math类,这个类包括常见有用的数学运算方法,这些方法包括三角函数方法、指数函数方法、对数函数方法、平方根函数方法等一些常用数学函数,除此之外该类还提供了一些常用的数学常量,例如PI、E等。
①Math类
Math类包含了所有用于数学运算的函数方法,主要包括三角函数方法、指数函数方法、取整函数方法、取最大值、最小值以及平均值函数方法,这些方法都是静态的,所以每个方法只要使用“Math.数学方法”就可以调用。
public static final double E
public static final double PI

在Math类中除了函数方法之外还存在一些常用数学常量,比如圆周率PI、E等,这些数学常量作为Math类的成员变量出现,可以使用“Math.变量名”调用。

②Math类的数学方法

三角函数方法:

在Math类中包含的三角函数方法:

Java 工具类介绍 java工具类说明_Java 工具类介绍_06


以上每个方法的参数和返回值都为double型的,参数以弧度代替角度来实现,其中1度等于π/180弧度,但值得注意的是,角度与弧度的互换通常是不精确的。指数函数方法:

在Math类中存在与指数相关的函数方法:

Java 工具类介绍 java工具类说明_Java 工具类介绍_07

System.out.println(Math.sqrt(4));   //2.0
System.out.println(Math.pow(2, 3));   //8.0
System.out.println(Math.log10(100));   //2.0

取整函数方法:

Java 工具类介绍 java工具类说明_编程语言_08


round方法等价于四舍五入。

System.out.println(Math.ceil(5.3));   //6.0
System.out.println(Math.floor(5.3));   //5.0
System.out.println(Math.round(5.6));   //6
System.out.println(Math.round(5.6));   //6

取最大值、最小值、绝对值函数方法:

Java 工具类介绍 java工具类说明_System_09

System.out.println(Math.max(6, 3));   //6
System.out.println(Math.min(6, 3));   //3
System.out.println(Math.abs(8));    //8
System.out.println(Math.abs(-8));   //8

5.随机数

在Java中主要提供两种方式产生随机数,分别为调用Math类的random()方法和Random类提供的产生各种数据类型随机数的方法。

①通过Math类生成随机数

在Math类中存在一个random()方法,用于产生随机数字,这个方法默认生成大于等于0.0小于1.0的double型随机数,即0 <= Math.random() < 1.0,虽然Math.random()方法只可以产生0~1的double型数字,其实只要在Math.random()语句上稍加处理,就可以使用这个方法产生任意范围的随机数,例,

Java 工具类介绍 java工具类说明_System_10


double d=(30+Math.random()*(60-30)); //求[30,60)区间的随机数 使用Math类的random()方法也可以随机生成字符,例,可以使用如下代码生成字符’a’~’z’的字符:(char)('a'+Math.random()*('z'-'a'+1));

通过上述表达式可以求出更多的随机字符,比如’A’~’Z’的随机,进而可以推理到求任意两个字符之间的随机字符,可以使用如下语句:(char)(cha1+Math.random()*(cha2-cha1+1));

注:random()方法返回的值实际上是伪随机数,它通过复杂的运算而得到一系列的数,该方法是通过当前时间作为随机数生成器的参数,所以每次执行程序都会产生不同的随机数。

②使用Random类生成随机数
在Java中还提供了一种可以获取随机数的方式,即java.util.Random类。可以通过实例化一个Random对象创建一个随机数生成器。
public Random()
以这种形式实例化对象时,Java编译器以系统当前时间作为随机数生成器的种子,因为每时每刻的时间不可能相同,所以产生的随机数将不同,但是如果运行速度太快,也会产生两次运行结果相同的随机数。
public Random(long seed)
根据seed给出随机数,每次程序运行得出的的随机数相同。

在Random类中提供获取各种数据类型随机数的方法:

Java 工具类介绍 java工具类说明_Java 工具类介绍_11


6.数字格式化类

Java主要对浮点型数据进行数字格式化操作,其中浮点型数据包括double型和float型数据,在Java中使用java.text.DecimalFormat类格式化数字。

DecimalFormat类:

在Java中对没有格式化的数据遵循以下原则:

  • 如果数据绝对值大于0.001并且小于10000000,Java将以常规小数形式表示
  • 如果数据绝对值小于0.001或者大于10000000,使用科学技术法表示

DecimalFormat是NumberFormat的一个子类,用于格式化十进制数字,它可以将一些数字格式化为整数、浮点数、科学计数法、百分数等。通过使用该类可以为要输出的数字加上单位或控制数字的精度。一般情况下可以实例化DecimalFormat对象时传递数字格式,也可以通过DecimalFormat类中的applyPattern()方法来实现数字格式化。

当格式化数字时,在DecimalFormat类中使用一些特殊字符构成一个格式化模板,使数字按照一定特殊字符规则进行匹配,下图列举了定义格式化模板中的特殊字符及其代表含义:

Java 工具类介绍 java工具类说明_编程语言_12

7.BigDecimal类
①概述
float和double表示的浮点数精度有限,在某些计算中很容易丢失精度,导致计算出错。例,System.out.println(0.09+0.01); //0.09999999999999999 为了解决这一问题,Java提供了BigDecimal类,它是不可变的,任意精度的有符号十进制数。它是java.math包下的类。

②构造方法
public BigDecimal(String val)

③常用方法
public BigDecimal add(BigDecimal augend)
public BigDecimal subtract(BigDecimal subtrahend)
public BigDecimal multiply(BigDecimal multiplicand)
public BigDecimal divide(BigDecimal divisor)
public BigDecimal divide(BigDecimal divisor,int scale,int roundingMode)

前四个方法为加、减、乘、除。最后一个方法的第一个参数是要除以的对象,第二个参数是结果保留的位数,第三个参数是是否要四舍五入,一般取BigDecimal的常量值。例,

BigDecimal bd = new BigDecimal(108);
BigDecimal bd2 = new BigDecimal(17);
System.out.println(bd.divide(bd2, 5, BigDecimal.ROUND_HALF_UP));   //6.35294
System.out.println(bd.divide(bd2, 3, BigDecimal.ROUND_HALF_UP));   //6.353

更多常用类介绍请看:Java常用类