JavaSE高階知識總結
1. 集合
從上圖可以看出,集合框架包含兩種型別的容器:一是Collection,用來儲存元素,二是Map,用來鍵值對關係對映,Collection介面又分為List、Set、Queue三個子介面,下面又分為一個抽象類,最後是具體實現類,常用的有ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap
-
介面
Collection:Collection儲存一組不唯一、無序的物件
List:List儲存一組不唯一、有序的物件
Set:Set儲存一組唯一、無序的物件
SortSet:繼承自Set,儲存有序的物件
Map:Map儲存一組鍵值物件
Map.Entry:描述Map中的一個物件
SortMap:j繼承自Map,使Key保持升序
-
List和Set的區別
List支援有序且不唯一的物件,Set只能存放無序物件,並且可以重複
List可以通過索引取值,查詢速度快,刪除和插入速度慢,插入資料時,會影響當前資料的位置
Set不可以通過索引取值,查詢速度慢,刪除和插入速度快,插入資料時,不會影響當前資料的位置
-
實現類
LinkList:允許為null,用於建立連結串列資料結構,執行緒非安全
ArrayList:動態增長陣列,執行緒非安全,增長偏移量為當前長度的50%
HashSet:不允許出現重複物件,只允許儲存一個null
LinkedHashSet:具有可預知迭代順序的Set介面的雜湊表和連結列表實現
HashMap 是一個散列表,它儲存的內容是鍵值對對映,根據鍵的HashCode值儲存資料,具有很快的訪問速度,最多允許一條記錄的鍵為null,執行緒非安全
LinkedHashMap:繼承於HashMap,使用元素的自然順序對元素進行排序
-
如何使用迭代器
iterationiterator():通過容器獲得該容器的迭代器物件
hasNext():判斷迭代器中是否存在下一個元素
next():返回迭代器中的下一個元素
2. 泛型
泛型允許提供編譯型別的安全檢測機制,該機制能夠確保在編譯時就能夠檢測到非法資料。泛型的本質是引數化l型別,就是操作的資料被指定為一個數據型別
-
泛型方法
範圍方法在呼叫時可以接收不同型別的引數
定義規則:
所有泛型方法宣告都有一個引數型別宣告部分<>,該引數宣告在方法返回值之前
每個引數宣告部分可以包含一個或多個數據型別,用逗號隔開
型別引數能被宣告返回值型別,也能被宣告為形參型別
型別引數只能表示引用型別
-
泛型類
泛型類的宣告和非泛型類的宣告類似,除了在類名後面添加了型別引數宣告部分
因為他們接受一個或多個引數,這些類被稱為引數化的類或引數化的型別
public class Box<T> { private T t; public void add(T t) { this.t = t; } public T get() { return t; }
-
型別萬用字元
?:可以接收任意泛型物件
泛型的上限:extends
泛型的下限:super
3. 流
-
抽象基類
Reader:字元輸出流
Writer:字元輸入流
InputStream:位元組輸出流
OutputStream:位元組輸入流
-
實現類
FileReader:字元輸入流,從檔案中讀取某個字元
BufferedReader:緩衝字元輸入流,作用是為其他字元輸入流提供緩衝功能,建立時需要向它傳遞一個字元輸入流,BufferedReader會將Reader中的字元分批讀取,每次讀取一部分
InputStreamReader:輸入轉換流,將一個位元組流中的位元組解碼成字元,建立時需要一個位元組輸入流
FileWriter:字元輸出流,向檔案中寫入某個字元
BufferedWriter:緩衝字元輸出流,作用是為其他字元輸出流提供緩衝功能,建立時需要向它傳遞一個字元輸出流,BufferedWriter會將Writer中的字元分批寫入,每次寫入一部分
OutputStreamReader:用於將寫入的字元編碼成位元組後寫入一個位元組流,建立時需要一個位元組輸出流
FileInputStream:位元組輸入流,從檔案中讀取某個位元組,通常用來讀取圖片
FileOutputStream:位元組輸出流,向檔案中寫入某個位元組,通常用來寫入圖片
4. 序列化
-
序列化物件
ObjectOutputStream類用來序列化一個物件,建立時需要傳遞一個位元組輸出流,通過呼叫writeObject()方法將物件寫入到檔案中
-
反序列化物件
ObjectInputStream類用來反序列化一個物件,建立時需要傳遞一個位元組輸入流,通過呼叫readObject()方法將物件從檔案中取出
5. 程式、程序和執行緒
程式:程式是指令和資料的有序集合,其本身沒有任何執行的含義,是一個靜態的概念
程序:程序就是程式的執行過程
執行緒:通常一個程序中包含若干個執行緒,執行緒是一個比程序更小的執行單位,多個執行緒貢獻一塊記憶體空間
6. 執行緒的基本狀態
新建:新建一個執行緒物件
可執行:執行緒建立後,呼叫該執行緒start()方法後,該執行緒就位於可執行執行緒池中等待執行緒排程,獲得時間片
執行:可執行的執行緒獲得了時間片,執行程式程式碼
阻塞:執行緒因為某種原因放棄了cpu使用權,讓出時間片,程式暫停。直到執行緒進入可執行狀態,才有可能再次獲得時間片。發生阻塞無外乎三種情況,一是呼叫了wait()方法,JVM會將其放入等待佇列中。只有其他執行緒呼叫notify()或notifyAll(),等待佇列中的執行緒才會被加入到鎖池。二是執行執行緒在獲取物件的同步鎖時,發現同步鎖已被其他執行緒佔用,JVM會將其放入鎖池,只有拿到鎖才能進入可執行狀態。三是執行執行緒呼叫了sleep()、join()、或者I/O請求,JVM會將該執行緒置為到阻塞狀態,當sleep超時、join等待執行緒結束或超時、I/0處理完畢,執行緒可重新進入可執行狀態。
死亡:執行緒run()、main()方法執行結束,或者因異常退出了run()方法,則該執行緒結束生命週期,執行緒死不可復生
7. 反射
Java反射機制就是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法,對於任意一個物件,都能夠呼叫它的任意方法和屬性,這種動態獲取屬性以及呼叫方法的機制稱為反射
-
Class 表示正在執行的Java應用程式中的類和介面
如何獲取某個class檔案物件的class物件?
已知類和物件,通過類名.class或物件.getClass()
未知類和物件通過Class.forName("包名.類名")
-
Constructor 關於類的單個構造方法的資訊以及對它的訪問許可權
Constructor類的例項物件代表類的一個構造方法
如何獲取某個類的所有構造方法?
通過class物件的getConstructors()方法
-
Field 提供有關類或介面的單個欄位的資訊,以及對它的動態訪問許可權
Field代表某個類中的一個成員變數,並提供動態訪問的許可權
如何獲取所有的成員變數?
通過getFields()方法獲取所有public屬性,通過getDeclaredFields()方法獲取所有宣告屬性
如何獲取指定的成員變數
通過getField("")獲取public屬性,通過getDeclaredField("name")獲取宣告屬性
設定Field變數是否可以訪問
field.setAccessible(boolean);
Field變數值的讀取、設定
-
field.get(obj);
- field.set(obj, vlaue);
-
-
Method 提供關於類或介面上單獨某個方法的資訊
Method類代表某個類中的一個成員方法
如何獲取所有方法?
通過getMethods()方法獲取所有public方法,通過getDeclaredMethods()方法獲取所有宣告方法
如何獲取指定方法?
通過getMethod(String name, Class<?>...parameterTypes)獲取指定public方法,通過getDeclaredMethod(String name, Class<?>...parameterTypes)方法獲取指定宣告方法
-
通過反射執行方法
invoke(Object obj, Object...args)