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();
//....
}
使用格式:
-
定義實現類時可以確定泛型的類型
public class MyInterfaceImpl implements MyGenericInterface<String> { @Override public void add(String e) { //.... } @Override public String get(){ // .... } }
備註:此時泛型【T的值】就是String類型
-
始終不確定泛型的類型,直到創建對象的時候,確定泛型的類型
例如:
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
List