常用類:日期時間、比較器、其他
尚硅谷JavaSE筆記-21

日期時間(JDK 8前)

提前說下,這些過時的類型跟方法實際95%用不上,了解一下就夠了

  • System類中的currentTimeMillis():返回當下與1970年1月1日之間的時間差,單位毫秒
    • 這一長串的數字稱為時間戳

java.util.Date類

  • 創建

    • 使用空參構造器:創建一個當前時間的物件,格式為Wed Dec 01 13:35:20 CST 2021

    • 形參傳入時間戳,創建一個該時間戳的物件

  • 方法

    • toString():顯示時間
    • getTime():返回時間戳

java.sql.Date類

  • 本身是java.util.Date的子類,用來對應資料庫中的日期變量
    • 為了區分,最好使用全類名例如:java.sql.Date d2 = new java.sql.Date(d1.getTime());
    • 創建:形參必須傳入時間戳
    • 方法:
      • toString():顯示時間,格式只有日期,如:2021-12-01
      • getTime():返回時間戳
  • java.util.Datejava.sql.Date轉換:形參中填入getTime()即可互轉

SimpleDateFormat類

  • 顧名思義,把Date類格式化成String用的

  • 創建一個形參為你想要的格式(如常見的yyyy-MM-dd hh:mm:ss)的SimpleDateFormat物件

  • 用此物件調用format(date物件)方法返回想要的String,舉例:

    Date d1 = new Date();
    
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    String s1 = sdf.format(d1);
    System.out.println("s1 = " + s1);
    
  • 還原(解析)文字重回Date類,也要符合該物件生成時的格式,並且用try包裹,舉例:

                try {
                    Date d2 = sdf.parse(s1);
                    System.out.println("d2 = " + d2);
                } catch (ParseException e) {
                    e.printStackTrace();
                }
    

Calendar類

  • 日曆,用於找"今天是今年第幾天"之類的問題

  • 本身是個抽象類,要調用時可選擇創建其子類GregorianCalendar的物件

  • 或是更簡便的調用其靜態方法 getTnstance(),舉例:

    Calendar ca = Calendar.getInstance();
    
    int days1 = ca.get(Calendar.DAY_OF_YEAR);
    System.out.println("days1 = " + days1);
    
  • 這個例子中,物件ca預設就是當前時間,然而他是可以被操作的,使用set()add()方法去改變其自身屬性,解決例如"n天後是今年第幾天"這種問題,但這個實在很怪,個人覺得使用場景不多

  • getTime():從日曆類轉成date類

  • setTime():從date類轉成日曆類,用於解決例如給一個日期"Wed Dec 01 16:49:56 CST 2021“要你算出他是今年第幾天之類的問題

  • 使用時注意,一月=0、二月=1…十二月=11,周日=1、周一=2…周六=7,簡直搞事

日期時間(JDK 8後)

前面那些實在缺點太多太難用,大家都用Joda-Time這個第三方時間包,後來就被官方收編成了java.time

LocalDateTime

  • now():返回當前時間
  • of(形參):設置指定的時間
  • getXXX():獲取相對時間,例如當月的第幾日之類
  • withXXX(形參):返回一個不可變的LocalDateTime類物件,設置相對時間用,例如某年的5月
  • plusXXX(時間):返回一個增加多久時間的LocalDateTime類物件,例如今天買會員,3個月後過期
  • minusXXX(時間):同上,減少

Instant

精準到納秒的時間類,跟java.util.Date類九成像

  • Instant.now():靜態方法,返回當前時間,根據UTC時區
  • atOffset(ZoneOffset.ofHour(8):返回一個offsetDateTime類的物件,位於+8時區
  • toEpochMilli():返回自1970開始的時間戳
  • ofEpochMilli(時間戳):從時間戳創立物件

DateTimeFormatter

格式化,跟SimpleDateFormat類九成像

  • 預設標準格式ISO_XXX

  • 本地化格式ofLocalizedDateTime(FormatStyle)

  • ofPattern(自訂格式):靜態方法,返回一個DateTimeFormatter物件

  • format(時間物件):格式化

  • parse(string):還原

其他API

  • ZoneID:時區
  • Duration:兩個時間間隔
  • Period:兩個日期間隔
  • TemporalAdjusters:該類通過靜態方法提供大量firstdayofxxnextXXX之類的方法

Java比較器

只要涉及到物件要比較大小、排序就會用到這2個接口

Comparable

  • 又稱自然排序,一般都是從低到高、小到大

  • String包裝類等等已經內建實現了Comparable接口,重寫了compareTo(obj)方法,可以自然用Arrays.sort(欲排列數組)方法排序

  • 如果是一個自訂類,則需要手動實現重寫compareTo(obj)方法,舉例:

        // 指明排序方式,例如價格低到高
        @Override
        public int compareTo(Object o) {
            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 -this.name.compareTo(goods.name);
    
                }
                // 直接調用該數據類型的compare
    //            return Integer.compare(this.price, goods.price);
            }
            throw new RuntimeException("傳入類型不一致");
        }
    
  • 優勢在於,我的類實現了此接口,創立出來的物件都可以比較排序了

Comparator

  • 訂製排序,與Comparable不同之處在於Comparable的方法A.compareTo(B)是先需要一個當前類的物件A去跟B比較

  • Comparator實現的方法是compare(obj1, obj2),常用匿名內部類實現,舉例:

    String[] arr = new String[]{"aa", "bb", "dd", "cc", "zz", "rr"};
    Arrays.sort(arr, new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            // 可以在這邊自訂排序的規則,例如我想從z to a
            return -o1.compareTo(o2);
        }
    });
    System.out.println(Arrays.toString(arr));
    
  • 優勢:

    • 用在比如自訂類不方便去實現Comparable接口的場合
    • 直接在Arrays.sort形參後面加個”,“就可以非常方便一次性使用
    • 可以用lambda表達式,例如:Arrays.sort(arr, (o1, o2) -> 0);,既優雅效率又高

System類

  • 位於java.lang包下
  • 由於該類的構造器是private,所以無法創造物件
  • 內部的成員變量或方法都是靜態的,可以直接調用

成員變量

  • System.in:標準輸入流(鍵盤)
  • System.out:標準輸出流(螢幕)
  • System.err:標準錯誤輸出流(螢幕)

成員方法

  • currentTimemillis():返回時間戳
  • exit(int status):退出程序,status=退出代碼,0表示正常
  • gc():呼叫垃圾車
  • getProperty(String key):獲取一些系統訊息,key的舉例:user.name返回使用者名稱

Math類

常用的數學相關、科學常數等等,操作的數據通常都是double型,舉例:

  • abs:絕對值
  • sqrt:平方根
  • random:返回0.0~1.0隨機數
  • …有用到再去查即可

BigInteger類

  • 用來表示不可變的、任意精度的整數,並支援大多數math相關方法,多大數字都能用它

BigDecimal類

  • 用來表示不可變的、任意精度的有符號的十進制帶點數
  • 跟錢有關的,大多數都採用這個

臨時複習

突然想到,發現有點搞不清了,趕緊再複習一次

  • 重寫(override):繼承時,子類的形參、返回、異常類型以及權限範圍不能擴大,但可以有自己的處理方式;即外殼不變、內容改寫
  • 重載(overload):同一類中,同樣的方法名可以存在多個,只要他們參數不同,調用時會自己套用到對應的;最常見於構造器

小結

  • 關於時間,想要本地時間LocalDateTime,想要格式化用DateTimeFormatter
  • 物件想比較或排序,用Comparator

上次修改於 2021-12-06