1. 程式人生 > >Java集合框架和泛型機制

Java集合框架和泛型機制

1、容器類

JDK API中專門設計用來儲存其他物件的類,一般稱為物件容器類,簡稱容器類,這組類和介面的設計結構也被統稱為集合框架(Collection Framework)。集合框架中容器類的關係如下圖示:


Set的三個常用實現類:

HashSet類是Set介面實現類之一,使用較廣泛,它不儲存元素的加入順序。HashSet類根據元素的雜湊碼進行存放,取出時也可以根據雜湊碼快速找到。

LinkedHashSet類根據元素的雜湊碼進行存放,同時用連結串列記錄元素加入的順序。通過連結串列來儲存物件,一般插入和刪除效率較高,檢索效率相對較低。

TreeSet類使用紅黑樹結構對加入的元素進行排序存放,通過TreeSet構造方法來獲取TreeSet物件。

List的三個常用實現類:

ArrayList類擴充套件AbstractList並執行List介面,ArrayList類支援可隨需要而增長的動態陣列。ArrayList類對於使用索引取出元素有較高的效率,它可以使用索引來快速定位物件。但元素做刪除或插入速度較慢,因為使用了陣列,需要移動後面的元素已調整索引順序。

LinkedList類擴充套件AbstractSequentialList並執行List介面。它提供了一個連結列表資料結構,LinkedList容器類通過連線指標來關聯前後兩個元素。LinkedList是使用雙向連結串列實現的容器,所以針對頻繁的插入和刪除元素使用LinkedList類效率較高,它適合實現棧和佇列。

Vector類提供了實現可增長陣列的功能,Vector類大多數操作與ArrayList類相同,區別在於Vector類是執行緒同步的。

Java集合中不能存放基本型別資料,而只能存放物件的引用。

主要從兩方面來選擇容器:

(1)存放要求

無序:Set,不能重複

有序:List,允許重複

“key-value”對:Map

(2)讀寫資料效率

Hash:兩者都最高。

Array:讀快改慢。

Linked:讀慢改快。

Tree:加入元素可排序使用。

資料結構——表(線性表和連結串列)需要關注資料在記憶體中的儲存形式

線性表:在記憶體中分配一塊連續的儲存空間。線上性表中訪問資料元素是很快的,但當改變線性表長度的時候(往中間新增資料或刪除資料),其會在移動元素上花費大量的時間

。例如陣列Array,或ArrayList都是資料結構中線性表的實現。

連結串列:儲存的鏈式的,不強迫資料是在一片連續的記憶體空間,可以是分散儲存的,這樣表中的每個元素除了包括元素的值外,還要包括一些額外的資訊。查詢時間比線性錶慢。

備註:通過連結串列來儲存物件,一般插入和刪除效率較高,檢索效率相對較低。

2、泛型

應用背景:存入容器的物件在取出時需要強制轉換型別,因為物件加入容器時都被轉化為Object型別,而取出時又要轉成實際型別。

在Java中向下型別轉換時容易出現ClassCastException的異常,這時應當儘量避免。有什麼辦法可以讓裝入容器中的資料儲存自己的型別而不被轉化為Object物件呢,這就需要用到JDK5.0支援的新功能——Java的泛型。

定義:泛型只是編譯時的概念,是供編譯器進行語法檢查用的。所謂泛型,就是在定義(型別的定義,方法的定義,形式引數的定義,成員變數的定義等等)的時候,指定它為通用型別,也就是資料型別可以是任意的型別,如List<?> list = null,具體呼叫時,要將通用型別轉換成指定的型別。泛型提高了大型程式的型別安全和可維護性。

目的:

  • 努力將執行時異常轉換成編譯時的問題,減少執行時異常數量(提高了編譯器的能力)。
  • 解決模版程式設計的問題。