JDK8中的日期類:
1、日期時間API的迭代:
第一代:jdk 1.0 Date類
第二代:jdk 1.1 Calendar類,一定程度上替換Date類
第三代:jdk 1.8 提出了新的一套API
2、前兩代存在的問題舉例:
可變性:像日期和時間這樣的類應該是不可變的。
偏移性:Date中的年份是從1900開始的,而月份都從0開始。
格式化:格式化只對Date用,Calendar則不行。
此外,它們也不是線程安全的;不能處理閏秒等。
3、java 8 中新的日期時間API涉及到的包:
4.本地日期、本地時間、本地日期時間的使用:
LocalDate / LocalTime / LocalDateTime。
4.1 說明:
① 分別表示使用 ISO-8601日曆系統的日期、時間、日期和時間。它們提供了簡單的本地日期或時間,並不包含當前的時間信息,也不包含與時區相關的信息。
② LocalDateTime相較於LocalDate、LocalTime,使用頻率要高
③ 類似於Calendar
4.2 常用方法:
5.時間點:Instant:
5.1 說明:
① 時間線上的一個瞬時點。 概念上講,它只是簡單的表示自1970年1月1日0時0分0秒(UTC)開始的秒數。
② 類似於 java.util.Date類
5.2 常用方法:
6、日期時間格式化類:DateTimeFormatter
6.1 說明:
① 格式化或解析日期、時間
② 類似於SimpleDateFormat
6.2 常用方法:
① 實例化方式:
預定義的標準格式。如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
本地化相關的格式。如:ofLocalizedDateTime(FormatStyle.LONG)
自定義的格式:
如:ofPattern(“yyyy-MM-dd hh:mm:ss”)
// 重點:自定義的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)
DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
//格式化
String str4 = formatter3.format(LocalDateTime.now());
System.out.println(str4);//2019-02-18 03:52:09
//解析
TemporalAccessor accessor = formatter3.parse("2019-02-18 03:52:09");
System.out.println(accessor);
比較器:
1、Java比較器的使用背景:
Java中的對象,正常情況下,只能進行比較:== 或 != 。不能使用 > 或 < 的但是在開發場景中,我們需要對多個對象進行排序,言外之意,就需要比較對象的大小。
如何實現?
使用兩個接口中的任何一個:Comparable 或 Comparator
2、自然排序:使用Comparable接口:
2.1 說明
1.像String、包裝類等實現了Comparable接口,重寫了compareTo(obj)方法,給出了比較兩個對象大小的方式。
2.像String、包裝類重寫compareTo()方法以後,進行了從小到大的排列
3. 重寫compareTo(obj)的規則:
如果當前對象this大於形參對象obj,則返回正整數,
如果當前對象this小於形參對象obj,則返回負整數,
如果當前對象this等於形參對象obj,則返回零。
4. 對於自定義類來說,如果需要排序,我們可以讓自定義類實現Comparable接口,重寫compareTo(obj)方法。在compareTo(obj)方法中指明如何排序
** 自定義類代碼舉例:**
public class Goods implements Comparable{
private String name;
private double price;
//指明商品比較大小的方式:照價格從低到高排序,再照產品名稱從高到低排序
@Override
public int compareTo(Object o) {
// System.out.println("**************");
if(o instanceof Goods){
Goods goods = (Goods)o;
//方式一:
if(this.price > goods.price){
return 1;
}else if(this.price < goods.price){
return -1;
}else{
// return 0;
return -this.name.compareTo(goods.name);
}
//方式二:
// return Double.compare(this.price,goods.price);
}
// return 0;
throw new RuntimeException("傳入的數據類型不一致!");
}
// getter、setter、toString()、構造器:省略
}
3、定製排序:使用Comparator接口:
當元素的類型沒實現java.lang.Comparable接口而又不方便修改代碼,或者實現了java.lang.Comparable接口的排序規則不適合當前的操作,那麼可以考慮使用 Comparator 的對象來排序。
方式:
重寫compare(Object o1,Object o2)方法,比較o1和o2的大小:
如果方法返回正整數,則表示o1大於o2;
如果返回0,表示相等;
返回負整數,表示o1小於o2
代碼舉例:
@Test
public void test3(){
String[] arr = new String[]{"AA","CC","KK","MM","GG","JJ","DD"};
Arrays.sort(arr,new Comparator(){
//按照字符串從大到小的順序排列
@Override
public int compare(Object o1, Object o2) {
if(o1 instanceof String && o2 instanceof String){
String s1 = (String) o1;
String s2 = (String) o2;
return -s1.compareTo(s2);
}
// return 0;
throw new RuntimeException("輸入的數據類型不一致");
}
});
System.out.println(Arrays.toString(arr));
}
可以使用的排序方法有:
Arrays.sort(goods,com);
Collections.sort(coll,com);
new TreeSet(com);
兩種排序方式對比:
1、 Comparable接口的方式一旦一定,保證Comparable接口實現類的對象在任何位置都可以比較大小。
2、Comparator接口屬於臨時性的比較。
其他類:
System類:
System類代表系統,系統級的很多屬性和控制方法都放置在該類的內部。該類位於java.lang包。
由於該類的構造器是private的,所以無法創建該類的對象,也就是無法實例化該類。其內部的成員變量和成員方法都是static的,所以也可以很方便的進行調用。
方法:
native long currentTimeMillis()
void exit(int status)
void gc()
String getProperty(String key)
Math類:
java.lang.Math提供了一系列靜態方法用於科學計算。其方法的參數和返回值類型一般爲double型。
BigInteger類、BigDecimal類:
說明:
① java.math包的BigInteger可以表示不可變的任意精度的整數。
② 要求數字精度比較高,用到java.math.BigDecimal類
@Test
public void test2() {
BigInteger bi = new BigInteger("1243324112234324324325235245346567657653");
BigDecimal bd = new BigDecimal("12435.351");
BigDecimal bd2 = new BigDecimal("11");
System.out.println(bi);
// System.out.println(bd.divide(bd2));
System.out.println(bd.divide(bd2, BigDecimal.ROUND_HALF_UP));
System.out.println(bd.divide(bd2, 25, BigDecimal.ROUND_HALF_UP));
}