常用类之BigDecimal类、Date类、Calendar类、SimpleDateFormat类及System类
常用类
1.BigDecimal类
-
引言: 很多实际应用中需要精确运算,而double是近似值存储,不在符合要求,需要借助BIgDecimal。
-
BigDecimal
- 位置:java.math包中
- 作用:精确计算浮点数
- 基本类型存储在栈中,引用类型存储在堆中
- 创建方式:
BigDecimal bd=new BigDecimal("1.0");
-
方法:
BigDecimal add(BigDecimal db);//加
BigDecimal subtract(BigDecimal db);//减
BigDecimal multiply(BigDecimal db);//乘
BigDecimal divide(BigDecimal db);//除
-
除法:
divide(BigDecimal bd,int scal,RoundingMode mode)
- 参数scal:指定精确到小数点后几位。
- 参数mode:指定小数部分的取舍模式,通常采用四舍五入的模式,取值为BigDecimal.ROUND_HALF_UP。
1.1 BigDecimal代码演示
package classes.demo08;
import java.math.BigDecimal;
import java.math.RoundingMode;
public class TestBigDecimal {
public static void main(String[] args) {
double d1=1.0;//double 是近似值存储
double d2=0.9;
System.out.println(d1-d2);//输出0.09999999999999998
//面式题
double result=(1.4-0.5)/0.9;
System.out.println(result);//输出0.9999999999999999
//BigDecimal,大的浮点数精确计算
BigDecimal bd1 = new BigDecimal("1.0");
BigDecimal bd2 = new BigDecimal("0.9");
//加法
BigDecimal r1 = bd1.add(bd2);
System.out.println(r1);
//减法
BigDecimal r2 = bd1.subtract(bd2);
System.out.println(r2);
//乘法
BigDecimal r3 = bd1.multiply(bd2);
System.out.println(r3);
//先减再除法
BigDecimal r5 = new BigDecimal("1.4").
subtract(new BigDecimal("0.5")).
divide(new BigDecimal("0.9"));//除法
System.out.println(r5);
//除法时除不尽会报错,要用重载的选择保留几位小数的divide()方法
//四舍五入的取法BigDecimal.ROUND_HALF_UP
//除不尽的情况,保留小数位 //RoundingMode.HALF_UP:4舍5入法
//BigDecimal r6 = new BigDecimal("10").divide(new BigDecimal("3"),5,BigDecimal.ROUND_HALF_UP);
BigDecimal result1 = new BigDecimal("20").divide(new BigDecimal("3"),3,BigDecimal.ROUND_HALF_UP); // 10 除以 3,保留 5 位小数,采用四舍五入
System.out.println(result1);
}
}
运行结果
0.09999999999999998
0.9999999999999999
1.9
0.1
0.90
1
6.667
2.Date类
-
Date表示特定的瞬间,精确到毫秒。Date类中的大部分方法都已经被Calendar类中的方法所取代。
-
时间单位
- 1秒=1000毫秒
- 1毫秒=1000微秒
- 1微秒=1000纳秒
2.1 Date类使用代码演示
package classes.demo08;
import java.util.Date;
/*
在程序开发中,经常需要处理日期和时间的相关数据,此时我们可以使用 java.util 包中的
Date 类。这个类最主要的作用就是获取当前时间,我们来看下 Date 类的使用:
使用 Date 类的默认无参构造方法创建出的对象就代表当前时间,我们可以直接输出 Date 对象显示当前的时间
其中, Wed 代表 Wednesday (星期三), Jun 代表 June (六月), 11 代表 11 号, CST 代表 China Standard Time (中国标准时间,也就是北京时间,东八区)。
从上面的输出结果中,我们发现,默认的时间格式不是很友好,与我们日常看到的日期格式不太一样,如果想要按指定的格式进行显示,如 2014-06-11 09:22:30 ,那该怎么做呢?
此时就到了 java.text 包中的 SimpleDateFormat 类大显身手的时候了!!可以使用 SimpleDateFormat
来对日期时间进行格式化,如可以将日期转换为指定格式的文本,也可将文本转换为日期。
具体参考博客:https://blog.csdn.net/silent0001/article/details/100149282?spm=1001.2014.3001.5502
* */
public class TestDate {
public static void main(String[] args) {
//1 创建Date对象
Date date = new Date();
//今天
//d1.toString() 以字符串的形式打印
//使用 Date 类的默认无参构造方法创建出的对象就代表当前时间,我们可以直接输出 Date 对象显示当前的时间
System.out.println(date.toString());//Fri Jul 01 14:18:52 CST 2022
System.out.println(date.toLocaleString());//2022-7-1 14:18:52
//昨天
Date d1=new Date(date.getTime()-60*60*24*1000);
System.out.println(d1.toLocaleString());
//2 方法 after before (返回的是Boolean类型)
boolean result = date.after(d1);//今天是否在昨天之后 true
System.out.println(result);
boolean beforeresult = date.before(d1);
System.out.println(beforeresult);//false
//比较compareTo() 比较(比的是毫秒值)(返回的为int)
System.out.println(date.compareTo(d1));
//equals() 判断是否相等,返回Boolean类型
System.out.println(date.equals(d1));
}
}
运行结果
Fri Jul 01 19:01:04 CST 2022
2022-7-1 19:01:04
2022-6-30 19:01:04
true
false
1
false
3.Calendar类
-
引言: Date 类最主要的作用就是获得当前时间,同时这个类里面也具有设置时间以及一些其他的功能,但是由于本身设计的问题,这些方法却遭到众多批评,不建议使用,更推荐使用 Calendar 类进行时间和日期的处理
- java.util.Calendar 类是一个抽象类,可以通过调用 getInstance() 静态方法获取一个 Calendar 对象,此对象已由当前日期时间初始化,即默认代表当前时间
-
Calendar
- Calendar提供了获取或设置各种日历字段的方法。
- 构造方法:
protected Calendar()
由于修饰符是protected,所以无法直接创建该对象
-
方法
方法名 | 说明 |
---|---|
static Calendar() | 设置默认时区和区域获取日历 |
void set(int year, int mouth, int date, int hourofday, int minute, int second) | 设置日历的年月日时分秒 |
int get(int field) | 返回给定日历字段的值,字段比如年月日等 |
void setTime(Date date) | 用给定的Date设置此日历的时间 |
Date getTime() | 返回一个Date表示日历的时间 |
void add(int field, int amount) | 按照日立的规则,给指定字段添加或减少时间量 |
long getTimeInMillies() | 毫秒为单位返回该日历的时间值 |
3.1 Calendar 类方法使用代码演示
package classes.demo08;
import java.util.Calendar;
public class TestCalender {
public static void main(String[] args) {
//1 创建Calendar对象 Protected Calendar() 由于修饰符是protected,所以无法之间创建对象。 但是可以通过getInstance()方法
Calendar instance = Calendar.getInstance();
System.out.println(instance.toString());//和date还不一样,并不是我们需要的信息
System.out.println(instance.getTimeInMillis());
//打印时间,要使用getTime()方法
System.out.println(instance.getTime().toLocaleString());
//2 获取时间信息
//获取年
int year = instance.get(instance.YEAR);
//获取月
int month = instance.get(instance.MONTH);
//获取日
int day = instance.get(instance.DAY_OF_MONTH);
//获取小时
int hour = instance.get(instance.HOUR_OF_DAY);
//获取分钟
int minute = instance.get(instance.MINUTE);
//获取秒
int second = instance.get(instance.SECOND);
//输出(注意月要加一) 因为外国是0-11个月
System.out.println(year+"年"+(month+1)+"月"+day+"日"+" "+hour+"时"+minute+"分"+second+"秒");
//3 修改时间
//先创建一个时间
Calendar calendar = Calendar.getInstance();
//调用set方法
calendar.set(calendar.HOUR_OF_DAY,1);//小时变为1
System.out.println(calendar.getTime().toLocaleString());
//用add方法修改时间
calendar.add(calendar.MONTH,-1);//相当于把小时减一
System.out.println(calendar.getTime().toLocaleString());
// 补充方法 判断月有多少天
int actualMaximum = calendar.getActualMaximum(calendar.DAY_OF_MONTH);//最多天数
int actualMinimum = calendar.getActualMinimum(calendar.DAY_OF_MONTH);
System.out.println(actualMaximum);
System.out.println(actualMinimum);
}
}
运行结果
java.util.GregorianCalendar[time=1656674064029,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=31,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2022,MONTH=6,WEEK_OF_YEAR=27,WEEK_OF_MONTH=1,DAY_OF_MONTH=1,DAY_OF_YEAR=182,DAY_OF_WEEK=6,DAY_OF_WEEK_IN_MONTH=1,AM_PM=1,HOUR=7,HOUR_OF_DAY=19,MINUTE=14,SECOND=24,MILLISECOND=29,ZONE_OFFSET=28800000,DST_OFFSET=0]
1656674064029
2022-7-1 19:14:24
2022年7月1日 19时14分24秒
2022-7-1 1:14:24
2022-6-1 1:14:24
30
1
4.SimpleDateFormat类
- SimpleDateFormat是一个以与语言环境有关的方式来格式化和解析日期的具体类
- 进行格式化(日期→文本)、解析(文本→日期)
- 常用的时间模式字母
字母 | 日期或时间 | 示例 |
---|---|---|
y | 年 | 2019 |
M | 年中月份 | 08 |
d | 月中天数 | 10 |
H | 一天中小时(0-23) | 22 |
m | 分钟 | 16 |
s | 秒 | 59 |
S | 毫秒 | 356 |
4.1 SimpleDateFormat类常用方法代码演示:
package classes.demo08;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class TestSimpleDateFormat {
public static void main(String[] args) throws ParseException {
//1 创建SimpleDATeFormat对象 y年 M月
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd");
//SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
//2 创建Date 获取时间
Date date = new Date();
//调用format()方法 格式化date(把日期转成字符串)
String format = simpleDateFormat.format(date);
System.out.println(format);
//调用parse()方法 解析(把字符串转为日期)(字符-->日期)
// 使用时需要和前后日期格式一致
Date parse = simpleDateFormat.parse("2022/07/01");//需抛出异常
System.out.println(parse);
}
}
运行结果
2022/07/01
Fri Jul 01 00:00:00 CST 2022
5.System类
- 主要用于获取系统的属性数据和其他操作,构造方法私有的
- 方法
方法名 | 说明 |
---|---|
static void arraycopy(...) | 复制数组 |
static long currentTimeMillis(); | 获取当前系统时间,返回毫秒值 |
static void gc(); | 建议jvm赶快启动垃圾回收期器回收垃圾 |
static void exit(int status); | 退出jvm 如果参数是0表示正常退出jvm;非0表示异常退出 |
5.1 System类方法代码演示:
package classes.demo08;
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
protected void finalize() throws Throwable {
System.out.println(name+"被回收了");
}
}
package classes.demo08;
public class TestSystem {
public static void main(String[] args) {
//1 arraycopy(),数据复制
int[] arry={15,35,52,45,78,90,56};
int[] ints=new int[7];
//System.arraycopy(src,srcPos,dest,destPos,length);
//src:源数组
//srcPos:从哪个位置开始复制
//dest:目标数组
//destPos:目标数组的位置
//length:复制的长度
System.arraycopy(arry,3,ints,0,3);
for (int anInt : ints) {
System.out.println(anInt);
}
//2 currentTimeMillis(),获取时间
System.out.println(System.currentTimeMillis());
long star = System.currentTimeMillis();
int result=0;
for (int i = -99999; i < 99999; i++) {
for (int i1 = -999999; i1 < 99999; i1++) {
result=i+i1;
}
}
//计时 currentTimeMillis()方法主要用于计代码时间
long end = System.currentTimeMillis();
System.out.println("用时:"+(end-star));
//3 gc(),垃圾回收
//匿名使用后,会自动回收
Student st1 = new Student("小米", 19);
Student st2 = new Student("小明", 20);
new Student("xiaoxiao",18);
new Student("xiaobai",21);
System.gc();// 垃圾回收,在另一个类中重写 finalize() 方法,显示是否回收,当没有对象引用可能就会被回收
//4 exit(0),退出
System.exit(0);//退出JVM
System.out.println("执行结束");//不会被执行
}
}
运行结果
45
78
90
0
0
0
0
1656676265134
用时:6
xiaobai被回收了
xiaoxiao被回收了