Calendar類、 System類、 StringBulider類、 包裝類

  • 2020 年 12 月 1 日
  • 筆記

Calendar類

​ 概念

​ java . util . Calendar 日曆類,抽象類,在Date類後出現的,替換掉了很多Date類中的方法。該類將所有的可能用到的時間資訊封裝為靜態成員變數。通過類名.靜態成員變數獲取時間欄位值

​ 獲取方式

​ 由於Calendar類是一個抽象類,語言敏感性,Calendar類並不是直接創建對象來獲取時間屬性值,而是通過靜態方法創建,返回子類對象。

靜態方法如下:

public static Calendar getInstance():使用默認時區和默認的語言環境獲取一個日期對象

例如:

import java.util.Calendar
public class Demo01Calendar{
    public static void main(String[] args){
        Calendar calendar = Calendar.getInstance();//獲取一個日曆的對象
    }
}

常用的方法

  • ​ public int get(int field):返回的是一個給定的日曆欄位值
  • ​ public void set(int field,int value):將給定的日曆欄位設置為給定的值
  • ​ public abstract void add(int field,int amount):根據日曆規則,為給定的日曆欄位添加或者減去指定的時間量值
  • ​ public Date getTime();:返回的是一個表示此Calendar時間值(從曆元到現在的毫秒偏移值)的DATE對象
  • ​ public long getYimeInMillis():獲取日曆對象對應的毫秒值

Calendar類中提供了很多個成員常量,代表給定的日曆欄位:

欄位值 含義
YEAR
MONTH 月份
DATE 月中的某一天(幾號)
DAY_OF_MONTH 月中的第幾天
HOUR 時(12小時制)
HOUR_OF_DAY 時(24小時制)
MINUTE
SECOND
DAY_OF_WEEK 一周中的第幾天(周幾,周日為1)

備註:

1. 在西方的星期,開始為周日,中國為周一
2. 在Calendar類中,月份的表示是以0-11代表的是1-12月
3. 日期是有大小關係,時間靠後,時間越大。

System類

​ java.lang.System類中提供了大量的靜態方法,主要是用來獲取於系統相關的資訊或者是進行系統級操作。

常用的API方法:

  • ​ public static long currentTimeMills():獲取當前x系統時間對應的的毫秒值
  • ​ public static void arrarcopy(object src, int srcPos, object dest, int destPos ,int Length): 物數組當中的數據拷貝d到另一個數組當中
  • ​ public static void exit(int status): 停止當前正在執行的虛擬機 0代表正常退出,非0異常退出

currentTimeMills()方法

​ 實際上,它獲取到的是距1970年1月1日 0時0分0秒 到當前時間的毫秒值

arrarcopy()方法

​ 將一個數組當中的元素複製到另一個數據當中,數組的拷貝動作是一個系統級的操作,性能比較高

arraycopy方法當中涉及到5個參數:

參數列表 參數名稱 參數類型 參數含義
1 src Object 源數組
2 srcPos int 源數組索引的起始位置
3 dest Object 目標數組
4 destPos int 目標數組索引的起始位置
5 length int 複製元素的個數

今日內容:【Collection、泛型】

  • Collection集合
  • 迭代器
  • 增強for循環
  • 泛型

學習目標

  • ​ 能夠說出集合和數組的區別
  • ​ 能夠使用並說出Collection集合的常用功能
  • ​ 能夠說出集合的使用細節
  • ​ 能夠使用集合存儲自定義的類型
  • ​ 能夠使用for each 循環遍歷集合
  • ​ 能夠使用泛型定義集合對象
  • ​ 能夠理解泛型的上下限
  • ​ 能夠闡述泛型通配符的作用

Collection集合

​ 集合概述

​ 前面我們已經學習過ArrayList集合了,那麼集合它到底是一個什麼呢?

​ 集合:集合是Java中提供的一種容器,可以用來存儲多個數據。

​ 集合和數組既然都是容器,他們有啥區別?

​ 數組的長度是固定的,集合的長度是可變的

​ 數組中存儲的是同一種數據類型的元素,可以存儲基本數據類型也可以存儲引用數據類型,

​ 集合存儲的都是對象,而且對象的數據類型可以不一致。在開發當中一般當對象多的時候,使用集合來存儲對象。

集合的框架

​ JAVASE提供了滿足各種需求的API,我們在使用API的時候,先了解其繼承於介面操作的框架,才能了解何時使用哪個類,以及類與類之間是如何彼此合作的,從而達到靈活的應用。

​ 集合根據其存儲結構把它分為兩大類:分別是單列集合 java.util.Collection 和雙列集合 java.util.Map ,今天主要講解單列Collection單列集合。

​ Collection:它是單列集合的根介面,用於輸出一些列符號某種規則的元素,它有兩種重要的子介面,分別是 java.util.List 和 java.util.Set。其中,List介面特點元素有序,元素可重複,含有索引。Set介面集合特點元素不重複,沒有索引。List介面的主要實現類有: java.util.ArrayList 和 java.util.LinkedList , Set介面的主要實現類有:java .util.HashSet 和 java.util.TreeSet 。

用一張集合框架圖描述單列集合的體系:

備註:綠色是底層實現類,藍色都是介面類型

Collection集合常用功能

​ Collection集合是所有單列集合的父介面,在Collection集合中所有單列集合的共性的API方法,這些方法適用於所有的單列集合。增刪改查功能 crud

​ public boolean add(E e):把給定的對象添加到當前的集合當中。

​ public boolean clear():清空集合當中的所有的元素。

​ public boolean remove(E e):把給定的對象從當前集合當中刪除掉。

​ public boolean contains(E e):判斷當前集合當中是否包含給定的對象元素。

​ public boolean isEmoty():判斷當前集合是否為空。null 空

​ public int size():獲取當前集合元素的個數

​ public Object[ ] toArray():把當前集合中的元素,存儲到一個數組當中。

程式碼測試:

​ 有關該介面當中的其他api方法,大家可以自行查看api 幫助文檔。

迭代器Iterator

​ 迭代器Iterator介面

​ 在程式開發過程中,經常需要遍歷集合當中的所以元素,針對這種情況,JDK官方有提供了一個介面 java.util.Iterator。Iterator 介面它也是集合當中的一員,但是它與 Map、Collection 介面不同,Collection 介面和 Map 介面主要是用來存儲元素的,而 Iterator 主要是用於迭代分為 Collection 與 Map 介面當中的元素。因此我們也經常把 Iterator 對象稱為迭代器。

​ 想要遍歷Collection 集合當中的元素,首先需要獲取該集合的迭代器,通過迭代器完成訂單操作

獲取迭代器的方法:

​ public Iterator iterator():獲取集合對應的迭代器,用來遍歷集合當中的元素。

迭代的概念

​ 迭代:Colletion集合元素的通用獲取方式。具體實現:在名稱取元素之前首先判斷集合當中有沒有元素,如果有,就把這個元素取出來,繼續在判斷,如果還有就再一次取出來,一直把集合當中的所以元素全部取出來。我們把這種取出方法在專業術語稱為迭代。

Iterator介面常用 api 方法:

​ public E next():獲取迭代的下一個元素。

​ public boolean hasNext():如果集合當中仍有元素可以迭代,則返回true,如果沒有元素,則返回false。

程式碼實例:

迭代器的實現原理

迭代器實現原理

​ 在調用Iterator介面當中的next方法之前,迭代器是索引位於第一個元素之前,不指向任何元素,單反第一次調用迭代器的next方法後,迭代器的索引會向後移動一位,指向第一個元素並將該元素返回。當再次調用next方法時,迭代器的索引會指向第二個元素並將該元素返回,以此類推,指定hasNext方法返回false時,表示迭代器達到了集合的末尾,終止對有的遍歷。如果強硬的再取集合的元素,此時程式就會拋出沒有元素 java.util.NoSuchElementException 。

備註:Iterator 介面也是有泛型的,迭代器的泛型時跟著集合走到,集合當中定義的什麼類型,迭代器就是什麼類型。

增強for循環

​ 在JDK1.5之後出現了一個新的循環結構,for each 循環,一般也稱為增強for 循環,專門用來遍曆數組和集合的。它的內部原理其實是有個迭代器Iterator,在達到過程中,不能對集合當中的也是進行增刪操作。

for(元素的數據類型  變數名 : Collection集合或者是數組){
    //操作程式碼
    //.....
}

主要用於遍歷Collection集合或者數組。在遍歷的過程中,移動不要進行增刪操作

練習1: 遍曆數組

int[] arr = {3,5,7,9,12};
//使用for each循環遍歷 arr 集合
for(int e: arr){//此時e 代表的是數組當中的每個元素
    System.out.println(e)
}

練習2:遍歷集合

Collection coll = new ArrayList<>();
//姚明 科比 喬丹 詹姆斯 加索爾 庫里
coll.add("姚明");
coll.add("科比");
coll.add("喬丹");
coll.add("詹姆斯");
coll.add("加索爾");
coll.add("庫里");
 // 使用增強for循環
for(String str: coll){
    System.out.println(e)// str 此時表示的就是集合當中每個元素
}

備註:目標只能是Collection集合或者是數組,增強for循環僅僅是作為遍歷操作出現。簡化迭代器的操作

泛型

​ 泛型概述

​ 泛型:可以在類或者方法當中預支的使用未知的數據類型。

備註:一般在創建對象的時候,將未知的數據類型確定為具體的數據類型,當沒有指定泛型時,默認類型為Object類型。

使用泛型的好處

​ 避免了類型轉換的麻煩,存儲的是什麼樣的數據類型,取出的就是什麼樣的數據類型

​ 把運行期異常(程式碼運行之後會拋出異常)提升到編譯期階段(寫程式碼的時候就會報錯。)

備註:泛型它其實也是數據類型的一部分,一般我們將類名泛型合併一起看做數據類型。

泛型的定義與使用

​ 泛型,用來靈活的將數據類型應用到不同的類、方法、介面當中。將數據類型作為參數進行傳遞。

​ 因為我們的集合框架體系中,大量的使用了泛型

定義和使用含有泛型的類

​ 定義格式:

修飾符 class 類名<代表泛型的變數>{
    
}

例如:

public class ArrayList<E>{
    public boolean add(E e){}
    public E get(int index){}
    //....
}

備註:定義的時候使用未知的泛型的變數,使用的時候(創建對象)確定的泛型的具體類型。

定義並使用含有泛型的方法

​ 定義格式:

修飾符 <代表泛型的變數> 返回值類型 方法名(泛型參數){}

例如:

public class GenericMethod {
    // 定義帶有泛型的方法
    public <VIP> void show (VIP vip) {
        System.out.println(vip);
    }
    // 定義一個含有泛型的返回值
    public <VIP> VIP show02(VIP vip) {
        //.....
        return vip;
    } 
}
// 定義測試類
public class TestGenericMethod {
    public static void main(String[] args){
        // 創建對象
        GenericMethod gm = new GenericMethod();
        // 調用帶有泛型的方法
        gm.show("abc");// VIP vip 參數 ---》形參   String str  str="abc"
        gm.show(123);// VIP--->Integer  vip = 123
        gm.show2(3.14);// VIP --->Double vip=3.14
    }
}

定義並使用含有泛型的介面

定義格式:

修飾符  interface  介面名<代表泛型的變數> {}

例如:

public interface Collection<E> {
    public void add(E e);
    public Iterator<E> iterator();
}
// 自定義一個泛型的介面
public interface MyGenericInterface<T> {
    public abstract void add(E e);
    public abstract E get();
    //....
}

使用格式:

  1. 定義實現類時可以確定泛型的類型

    public class MyInterfaceImpl implements MyGenericInterface<String> {
        @Override
        public void add(String e) {
            //....
        }
        @Override
        public String get(){
            // ....
        }
    }
    

    備註:此時泛型【T的值】就是String類型

  2. 始終不確定泛型的類型,直到創建對象的時候,確定泛型的類型

例如:

public class MyInterfaceImpl02<T> implements MyGenericInterface<T> {
    @Override
    public void add(T t) {
        //....
    }
    @Override
    public T get(){
        //......
    }
}

確定泛型

/*
    使用泛型
 */
public class Demo04Generic {
    public static void main(String[] args) {
       MyInterface<String>  my =  new MyInterfaceImpl<String>();
        my.add("abc");
        
    } 
}
泛型通配符 (?)
通配符的高級使用—-受限泛型(泛型的上限和下限)

思想題:泛型它其實也是一種數據類型 它能不能繼承? 不能繼承

​ 數據類型是有繼承關係 能不能在泛型當中實現繼承,不能的

​ Integer extends Number extends Object

​ List extends List 不可以

​ List extends List 不可以