1.BigDecimal类
public class BigDecimalDemo {
public static void main(String[] args) {
double d1=1.0;
double d2=0.9;
System.out.println(d1-d2);//0.09999999999999998
System.out.println((1.4-0.5)/0.9);//0.9999999999999999
}
}
-
上面两个输出说明double或float类型并不精确,是近似值存储,但在很多实际场景下,需要实用精确计算,如银行等,因此引入BigDecimal
-
BigDecimal位于java.Math包中,作用是精确计算浮点数,创建方式:BigDecimal bd=new BigDecimal("1.0")
public class BigDecimalDemo {
public static void main(String[] args) {
BigDecimal b1 = new BigDecimal("1.0");
BigDecimal b2 = new BigDecimal("0.9");
//加
BigDecimal add = b1.add(b2);
System.out.println(add);//1.9
//减
System.out.println(b1.subtract(b2));//0.1
//乘
System.out.println(b1.multiply(b2));//0.90
//除,若不进行限制,可能会报错,BigDecimal.ROUND_HALF_UP为四舍五入,scale为保留几位小数
System.out.println(b1.divide(b2,2,BigDecimal.ROUND_HALF_UP));//1.11
BigDecimal divide = new BigDecimal("1.4")
.subtract(new BigDecimal("0.5"))
.divide(new BigDecimal("0.9"),2,BigDecimal.ROUND_HALF_UP);
System.out.println(divide);//1.00
}
}
2.Date类
- Date表示特定的瞬间,精确到毫秒。Date类中的大部分方法都已经被Calendar类中的方法所取代
- 时间单位 :1秒=1000毫秒 1毫秒=1000微秒 1微秒=1000纳秒(也叫毫微秒)
import java.util.Date;
public class DateDemo {
public static void main(String[] args) {
Date date1=new Date();
System.out.println(date1.toString());
System.out.println(date1.toLocaleString());
//当前时间减1天的毫秒数
Date date2=new Date(date1.getTime()-(60*60*24*1000));
System.out.println(date2.toString());//Sat Jan 08 22:22:37 CST 2022
System.out.println(date2.toLocaleString());//2022-1-8 22:22:37
//方法
//1.after before
System.out.println(date1.after(date2));//true
System.out.println(date1.before(date2));//false
//2.compareTo equals
//compareTo:前者比后者大则返1,小则返回-1,相等返回0
System.out.println(date1.compareTo(date2));//1
System.out.println(date2.compareTo(date1));//-1
System.out.println(date1.compareTo(date1));//0
System.out.println(date1.equals(date2));//false
}
}
3.Calendar类
- Calendar提供了获取或设置各种日历字段的方法
- 构造方法
- 抽象类,无法直接实例化
- 其他方法
import java.util.Calendar;
public class CalendarDemo {
public static void main(String[] args) {
//Calendar是抽象类,无法直接实例化
Calendar calendar=Calendar.getInstance();
System.out.println(calendar.getTime().toLocaleString());
//方法:get
System.out.println(calendar.get(Calendar.YEAR));
System.out.println(calendar.get(1));
System.out.println(calendar.get(Calendar.MONTH));
System.out.println(calendar.get(Calendar.DAY_OF_MONTH));
System.out.println(calendar.get(Calendar.HOUR_OF_DAY));//Carlendar.HOUR为12进制表示小时
System.out.println(calendar.get(Calendar.MINUTE));
System.out.println(calendar.get(Calendar.SECOND));
//set
calendar.set(Calendar.HOUR_OF_DAY,13);
System.out.println(calendar.getTime().toLocaleString());
//add
calendar.add(Calendar.MINUTE,-10);
System.out.println(calendar.getTime().toLocaleString());
//getTimeInMillis获得一个毫秒数
long timeInMillis = calendar.getTimeInMillis();//获得一个毫秒数
System.out.println(timeInMillis);
//getActualMaximum/getActualMaximum
System.out.println(calendar.getActualMaximum(Calendar.MONTH));//11月份是0开始的
System.out.println(calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
System.out.println(calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
}
}
4.SimpleDateFormat类
- SimpleDateFormat是一个以与语言环境有关的方式来格式化和解析日期的具体类
- 进行格式化(日期-->文本)、解析(文本-->日期)
- 常用的时间模式字母:y、M、d、H、m、s(秒)、S(毫秒)
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatDemo {
public static void main(String[] args) throws ParseException {
//方法一:第一种构造方法,不带参数
SimpleDateFormat simpleDateFormat1=new SimpleDateFormat();
simpleDateFormat1.applyPattern("yyyy-MM-dd");
//格式化format(Date date):将时间格式转换成String
System.out.println(simpleDateFormat1.format(new Date()));
//第二种构造方法
SimpleDateFormat simpleDateFormat2=new SimpleDateFormat("y-M-d H:m:s");
System.out.println(simpleDateFormat2.format(new Date()));//2022-1-10 9:23:58
//解析:将String转成Date类型parse(String)
String str="2099-19-10";
//会抛出一个异常
Date date = simpleDateFormat1.parse(str);
System.out.println(date);//Sat Jul 10 00:00:00 CST 2100
}
}
5.System类
- System系统类,主要用于获取系统的属性数据和其他操作,构造方法私有。
- 方法:
import java.util.Arrays;
public class SystemDemo {
public static void main(String[] args) {
int []arr1={9,1,4556,4456,234,346,123,234};
int []arr2=new int[8];
//实现数组的copy
//参数1:源数组 ;参数2:从源数组的哪个位置开始copy;
//参数3:目标数组;参数4:从目标数组的哪个位置开始copy;
//参数5:copy长度
System.arraycopy(arr1,4,arr2,4,4);
for (int x:arr2) {
System.out.println(x);
}
//Arrays.copyOf底层是调用的System.arraycopy
//System.arraycopy方法是本地方法,有native(相当于调用c或c++)修饰,执行效率高
int[] ints = Arrays.copyOf(arr1, 8);
//获取当前毫秒数(1970年到现在),此方法一般用于计算一段程序执行的时间
System.out.println(System.currentTimeMillis());
long start=System.currentTimeMillis();
for (int i = 0; i < 999999; i++) {
for (int j = 0; j < 999999; j++) {
int result=i+j;
}
}
long stop=System.currentTimeMillis();
System.out.println(stop-start);
//gc垃圾回收器,调用此方法请求jvm启动垃圾回收器,但不一定会回收垃圾
new Student();//Student类在下面
new Student("abc",1);
new Student("cba",6);
System.gc();
//回收了cba6
//回收了abc1
//回收了null0
//exit方法退出jvm
System.out.println("我正在退出...");
System.exit(0);//0表示正常退出
System.out.println("我已经退出了");//已经退出jvm,所以这句不打印
}
}
public class Student {
private String name;
private int 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;
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public Student() {
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
protected void finalize() throws Throwable {
System.out.println("回收了"+this.name+this.age);
}
}