Java 四大常用 API:Runtime 运行时、BigDecimal 高精度计算、Date 日期、SimpleDateFormat 格式化
常用API
一、Runtime类
我们学习一个Java的运行时类,叫Runtime类。这个类可以用来获取JVM的一些信息,也可以用这个类去执行其他的程序。
Runtime类提供的常见方法
| 方法名 | 说明 |
|---|---|
| public static Runtime getRuntime() | 返回与当前Java应用程序关联的运行时对象 |
| public void exit(int status) | 终止当前运行的虚拟机 |
| public int availableProcessors() | 返回Java虚拟机可用的处理器数。 |
| public long totalMemory() | 返回Java虚拟机中的内存总量 |
| public long freeMemory() | 返回Java虚拟机中的可用内存 |
| public Process exec(String command) | 启动某个程序,并返回代表该程序的对象 |
话不多少,上代码。
/**
* 目标:了解下Runtime的几个常见方法。
*/
public class RuntimeTest {
public static void main(String[] args) throws IOException, InterruptedException {
// 1、public static Runtime getRuntime() 返回与当前Java应用程序关联的运行时对象。
Runtime r = Runtime.getRuntime();
// 2、public void exit(int status) 终止当前运行的虚拟机,该参数用作状态代码;
// 按照惯例,非零状态代码表示异常终止。
// r.exit(0);
// 3、public int availableProcessors(): 获取虚拟机能够使用的处理器数。
System.out.println(r.availableProcessors()); // 16
// 4、public long totalMemory() 返回Java虚拟机中的内存总量。
// 1024 = 1K 1024 * 1024 = 1M
System.out.println(r.totalMemory()/1024.0/1024.0 + "MB");
// 5、public long freeMemory() 返回Java虚拟机中的可用内存量
System.out.println(r.freeMemory()/1024.0/1024.0 + "MB");
// 6、public Process exec(String command) 启动某个程序,并返回代表该程序的对象。
Process p = r.exec("D:\\Software\\Tencent\\TIM\\Bin\\TIM.exe");
Thread.sleep(10000); // 让程序在这里暂停5s后继续往下走!!
p.destroy(); // 销毁!关闭程序!
}
}
二、BigDecimal类(重点)
各位同学,接下来我们学习的这个类叫BigDecimal,至于它是干什么用的,我们先不说。我们先看一段代码,看这个代码有什么问题?再说BigDeimal这个类是干什么用的,这样会更好理解一些。
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给我们提供了BigDecimal类,它提供了一些方法可以对数据进行四则运算,而且不丢失精度,同时还可以保留指定的小数位。
BigDecima的常见构造器
| 构造器 | 说明 |
|---|---|
| public BigDecimal(double val) 注意:不推荐使用这个 | 将 double转换为 BigDecimal |
| public BigDecimal(String val) | 把String转成BigDecimal |
底层计算的原理:
在BigDecimal内部,它使用一个整数数组来存储数值的每一位。通常情况下,数组的每个元素表示一组十进制数的位数,例如,数组的第一个元素表示最低位,第二个元素表示十位,以此类推。每个数组元素都是一个32位整数,即可以存储0到2^32-1之间的数值。
在进行数值的运算时,BigDecimal会根据操作的类型和需要的精度,对两个数值进行相应的运算,例如加法、减法、乘法和除法。运算的过程中,它会对两个数值的符号进行处理,并按照数学规则进行运算。对于除法运算,BigDecimal会通过精确的算法进行计算,避免了浮点数除法可能产生的精度损失。
BigDecima的常用方法
| 方法名 | 说明 |
|---|---|
| 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 |
下面看代码,演示一下
public class BigDecimalTest {
public static void main(String[] args) {
// 浮点型运算时, 直接+ - * / 可能会出现运算结果失真
double a = 0.1;
double b = 0.2;
System.out.println(a + b); //0.30000000000000004 此时会导致精度失真
System.out.println("-----------------------");
/**
* 如何解决精度失真问题? 使用BigDecimal可以解决
*/
// BigDecimal a1 = new BigDecimal(Double.toString(a));
// BigDecimal b1 = new BigDecimal(Double.toString(b));
/**
* 简单写法:
* 推荐用以下方式:把小数转换成字符串再得到BigDecimal对象来使用(更简洁)
*/
BigDecimal a1 = BigDecimal.valueOf(a);
BigDecimal b1 = BigDecimal.valueOf(b);
System.out.println(a1.add(b1)); // 加
System.out.println(a1.subtract(b1)); // 减
System.out.println(a1.multiply(b1)); // 乘
System.out.println(a1.divide(b1)); // 除
// 除法还可以设置精度保留几位
BigDecimal d1 = BigDecimal.valueOf(0.1);
BigDecimal d2 = BigDecimal.valueOf(0.3);
BigDecimal d3 = d1.divide(d2, 2, RoundingMode.HALF_UP); // 0.33
System.out.println(d3);
System.out.println("-----------------------");
// 把BigDecimal对象又转换成double类型的数据
double v = d1.doubleValue();
System.out.println(v);
}
}
三、Date类
接下来,我们学习一下Date类,Java中是由这个类的对象用来表示日期或者时间。
Date对象记录的时间是用毫秒值来表示的。Java语言规定,1970年1月1日0时0分0秒认为是时间的起点,此时记作0,那么1000(1秒=1000毫秒)就表示1970年1月1日0时0分1秒,依次内推。

下面是Date类的构造方法,和常见的成员方法,利用这些API写代码尝试一下

public class DateTest {
public static void main(String[] args) {
// 目标:掌握Date日期类的使用。
// 1、创建一个Date的对象:代表系统当前时间信息的。
Date d1 = new Date();
System.out.println(d1);
// 2、拿到时间毫秒值。
long time = d1.getTime();
System.out.println(time);
// 3、把时间毫秒值转换成日期对象: 2s之后的时间是多少。
time += 2 * 1000;
Date d2 = new Date(time);
System.out.println(d2);
// 4、直接把日期对象的时间通过setTime方法进行修改
Date d3 = new Date();
d3.setTime(time);
System.out.println(d3);
}
}
四、SimpleDateFormat类
各位同学,前面我们打印Date对象时,发现打印输出的日期格式我们并不喜欢,是不是?你们喜欢那种格式呢?是不是像下面页面中这种格式啊?接下来我们学习的SimpleDateFormat类就可以转换Date对象表示日期时间的显示格式。
-
我们把Date对象转换为指定格式的日期字符串这个操作,叫做日期格式化,
-
反过来把指定格式的日期符串转换为Date对象的操作,叫做日期解析。
-

接下来,我们先演示一下日期格式化,需要用到如下的几个方法

注意:创建SimpleDateFormat对象时,在构造方法的参数位置传递日期格式,而日期格式是由一些特定的字母拼接而来的。我们需要记住常用的几种日期/时间格式
字母 表示含义 yyyy 年 MM 月 dd 日 HH 时 mm 分 ss 秒 SSS 毫秒 EEE 星期几 a 上午/下午 "2022年12月12日" 的格式是 "yyyy年MM月dd日" "2022-12-12 12:12:12" 的格式是 "yyyy-MM-dd HH:mm:ss" 按照上面的格式可以任意拼接,但是字母不能写错
最后,上代码演示一下
public class SimpleDateFormatTest1 {
public static void main(String[] args) throws ParseException {
// 目标:掌握SimpleDateFormat的使用。
// 1、准备一些时间
Date date = new Date();
System.out.println(date);
// 获取毫秒值
long time = date.getTime();
System.out.println(time);
// 2、格式化日期对象,和时间 毫秒值。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss EEE a");
String rs1 = sdf.format(date);
System.out.println(rs1);
// 毫秒值进行时间格式化
String rs2 = sdf.format(time);
System.out.println(rs2);
System.out.println("----------------------------------------------");
// 目标:掌握SimpleDateFormat解析字符串时间 成为日期对象。
String dateStr = "1999-12-1 12:12:11";
// 1、创建简单日期格式化对象 , 指定的时间格式必须与被解析的时间格式一模一样,否则程序会出bug.
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d2 = sdf2.parse(dateStr);
System.out.println(d2);
}
}
日期格式化&解析案例
public class SimpleDateFormatDemo {
public static void main(String[] args) throws ParseException {
// 目标:完成秒杀案例。
// 1、把开始时间、结束时间、小贾下单时间、小皮下单时间拿到程序中来。
String start = "2023年11月11日 0:0:0";
String end = "2023年11月11日 0:10:0";
String xj = "2023年11月11日 0:01:18";
String xp = "2023年11月11日 0:10:57";
// 2、把字符串的时间解析成日期对象。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date startDt = sdf.parse(start);
Date endDt = sdf.parse(end);
Date xjDt = sdf.parse(xj);
Date xpDt = sdf.parse(xp);
// 3、开始判断小皮和小贾是否秒杀成功了。
// 把日期对象转换成时间毫秒值来判断
long startTime = startDt.getTime();
long endTime = endDt.getTime();
long xjTime = xjDt.getTime();
long xpTime = xpDt.getTime();
if(xjTime >= startTime && xjTime <= endTime){
System.out.println("小贾您秒杀成功了~~");
}else {
System.out.println("小贾您秒杀失败了~~");
}
if(xpTime >= startTime && xpTime <= endTime){
System.out.println("小皮您秒杀成功了~~");
}else {
System.out.println("小皮您秒杀失败了~~");
}
}
}更多推荐





所有评论(0)