BigDecimal類

一.使用場景
  • float和double類型的值存儲方式為近似存儲,在某些精度要求高的行業需要精確存儲數據,則需要使用BigDecimal類
二.BigDecimal類介紹
  • 位置:java.math包
  • 作用:精確計算浮點數
  • 創建方式:BigDecimal bd = new BigDecimal(”1.0“);
  • 方法:
  • 加:add()
  • 減:subtract()
  • 乘:multiply()
  • 除:divide()
  • 除法除不盡:divide(BigDecimal bd,int scale,RoudingMode mode)
  • scale:保留的小數位數
  • mode:指定小數部分的取捨模式,通常採用四捨五入(ROUND_HALF_UP)
//double類型計算
double d1 = 1.0;
double d2 = 0.9;
System.out.println(d1-d2);

//BigDecimal類型計算
BigDecimal bd1 = new BigDecimal("1.0");
BigDecimal bd2 = new BigDecimal("0.9");
//減法
BigDecimal r1 = bd1.subtract(bd2);
System.out.println(r1);
//加法
System.out.println(bd1.add(bd2));
//乘法
System.out.println(bd1.multiply(bd2));
//除法
BigDecimal r2 = new BigDecimal("1.5")
        .subtract(new BigDecimal("0.6"))
        .divide(new BigDecimal("0.9"));
System.out.println(r2);
//除法,除不盡,保留位數
BigDecimal r3 = new BigDecimal("10")
        .divide(new BigDecimal("3"),2,BigDecimal.ROUND_HALF_UP);
        //四捨五入保留兩位小數
System.out.println(r3);

//輸出結果:
-----double類型計算------
0.09999999999999998
-----BigDecimal類型計算------
0.1
1.9
0.90
1
3.33

Date類

  • Date表示特定的時間,精確到毫秒。
  • Date類中的大部分方法都已經被Calender類中方法取代
//1.創建
//今天的時間
Date date1 = new Date();
System.out.println(date1.toString());
//昨天,今天的時間減去一天的毫秒數
Date date2 = new Date(date1.getTime()-(60*60*24*1000));
System.out.println(date2);

//2.after,before方法
System.out.println(date1.after(date2));
System.out.println(date1.before(date2));

//compareTo()方法,比較毫秒數
// d1.compareTo(d2):若d1在d2前,則返回1,d1在d2後則返回-1,相等則返回0
System.out.println(date1.compareTo(date2));
System.out.println(date1.compareTo(date1));
System.out.println(date2.compareTo(date1));

//輸出結果:
Tue Aug 16 17:56:05 CST 2022
Mon Aug 15 17:56:05 CST 2022
true
false
1
0
-1

Calendar類

  • Calendar提供了獲取或設置各種日曆字段的方法
  • 構造方法:
  • protected Calendar():由於修飾符是protected,所以無法直接創建對象
  • 其他方法:
  • static Calendar getInstance() : 使用默認的時區和區域獲得日曆
  • void set(int year,int mouth,int date,int hourofday,int minute,int second) : 設置日曆的年,月,時分秒。
  • int get(int field) : 返回給定日曆字段的值。字段比如年月日等
  • void setTime(Date date) : 用給定的Date設置此日曆的時間。Date-Calendar
  • Date getTime(): 返回一個Date表示此日曆的時間。Calendar-Date
  • void add(int field,int amount) :按照日曆的規則給指定字段添加或減少時間量
  • long getTimeInMillies() : 毫秒為單位返回該日曆的時間值
//1.創建Calendar對象
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getTime().toString());
System.out.println(calendar.getTimeInMillis());//1970年1月1日至今的毫秒數

//2.獲取時間信息
//年
int year = calendar.get(Calendar.YEAR);
//月,範圍0-11
int month = calendar.get(Calendar.MONTH);
//日
int date = calendar.get(Calendar.DATE);
//時 HOUR:12小時,HOUR_OF_DAY:24小時
int hour = calendar.get(Calendar.HOUR_OF_DAY);
//分
int minute = calendar.get(Calendar.MINUTE);
//秒
int second = calendar.get(Calendar.SECOND);
System.out.println(year + "年" + (month + 1) + "月" + date + "日" + hour + "時" + minute +"分" + second + "秒");

//3.修改時間
Calendar calendar1 =Calendar.getInstance();
calendar1.set(Calendar.DAY_OF_MONTH,5);
System.out.println(calendar1.getTime().toLocaleString());

//4.add方法修改時間
calendar1.add(Calendar.HOUR,1);
System.out.println(calendar1.getTime().toLocaleString());

//5.補充方法,獲取某個字段最大值或者最小值
int max = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);//當前月份最多天數
int min = calendar.getActualMinimum(Calendar.DAY_OF_MONTH);//當前月份最小天數
System.out.println(max);
System.out.println(min);

//輸出結果:
Tue Aug 16 23:06:47 CST 2022
1660662407448
2022年8月16日23時6分47秒
2022-8-5 23:06:47
2022-8-6 0:06:47
31
1

SimpleDateFormat類

  • SimpleDateFormat是一個以與語言環境有關的方式來格式化和解析日期的具體類
  • 進行格式化:(日期----->文本);解析 :(文本------>日期)
  • 常用的時間模式字母:
  • y:年; M:月; d:日; H:小時; m:分鐘 ; s:秒; S:毫秒
public static void main(String[] args) throws Exception{
    //創建SimpleDateFormat對象
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");
    //創建Date
    Date date = new Date();
    //格式化date,把日期轉為字符串
    String str = sdf.format(date);
    System.out.println(str);

    //解析,把字符串轉換為日期
    Date date1 = sdf.parse("1997年03月12日20:13:23");//格式同sdf定義格式
    System.out.println(date1.toLocaleString());
}

//輸出結果:
2022年08月16日23:28:48
1997-3-12 20:13:23

System類

  • System系統類,主要用於獲取系統屬性和其他操作,私有的構造方法


//1.複製數組
/**
 * arraycopy:複製數組
 *src:源數組
 * srcPos:源數組複製開始的位置
 * dest:目標數組
 * destPos:目標數組複製的位置
 * length:複製的長度
 */
int[] array = {11,22,33,44,55,66,77,88,99};
int[] dest = new int[8];
System.arraycopy(array,0,dest,4,4);
//從array的下標為0的元素開始複製4個到dest數組下標為4開始的位置
String str = Arrays.toString(dest);
System.out.println(str);

//2.毫秒數,計算代碼執行時間

//開始時間
long start = System.currentTimeMillis();
StringBuilder sb = new StringBuilder();
for (int i = 0; i <999999 ; i++) {
    sb.append(i);
}
//結束時間
long end = System.currentTimeMillis();
System.out.println("用時為:" + (end - start));

//3.gc操作
Student s1 =new Student("aaa",11);
Student s2 =new Student("bbb",12);
Student s3 =new Student("ccc",13);//有引用,不會被回收
System.gc();

new Student("aaa",11);
new Student("bbb",12);
new Student("ccc",13);//無引用,被回收(隨機)
System.gc();

//4.退出JVM
System.exit(0);
System.out.println("看不見就是未執行");

//輸出結果
[0, 0, 0, 0, 11, 22, 33, 44]
用時為:36
回收了ccc  13
回收了bbb  12
回收了aaa  11