Java學習筆記十三(JDK8之後的日期時間、比較器和其他常用類)

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));

    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章