王如霜 廊坊師範學院資訊科技提高班十三期
阿新 • • 發佈:2018-12-13
在開始講集合之前,我們先說一下陣列和集合的區別:
- 陣列是大小固定的;同一個陣列只能存放型別一樣的資料(基本型別,如int/引用型別);可建立可讀並可寫的陣列,但不能建立只讀的;操作快
- 集合大小事可變的;同一個集合只能存放引用型別的的資料(不能存放基本資料型別,但能儲存基本型別的包裝類,如Integer);可建立只讀的的集合;功能多
- 容器類僅能持有物件引用(指向物件的指標),而不是將物件資訊copy一份至數列某位置
- 一旦將物件置入容器內,便損失了該物件的型別資訊
以下這張圖表明瞭集合的結構,集合的父介面為Collection:
以下表格表明了3種集合的區別:
Map | List | Set | |
是否可重複 | 否 | 是 | 否 |
是否有序 | HashMap 無序,TreeMap 有序 | 是 | 是 |
是否允許為null | 否 | 是 | 是 |
Map |
- 沒有繼承於Collection介面
- 是一種對映
- 是一種把鍵物件和值物件對映的集合,它的每一個元素都包含一對鍵物件和值物件。
主要的兩個實現類:
1.HashMap
-
HashMap:用到了雜湊碼的演算法,以便快速查詢一個鍵,無法估測元素存放的位置;
-
HashMap使用了特殊的值,稱為“雜湊碼”(hash code),來取代對鍵的緩慢搜尋。“雜湊碼”是“相對唯一”用以代表物件的int值,它是通過將該物件的某些資訊進行轉換而生成的。所有Java物件都能產生雜湊碼,因為hashCode()是定義在基類Object中的方法,HashMap就是使用物件的hashCode()進行快速查詢的。此方法能夠顯著提高效能
2.TreeMap
- TreeMap:用到了二叉樹演算法,根據鍵按序存放,是可以估測元素存放的位置;
- 基於紅黑樹資料結構的實現。檢視“鍵”或“鍵值對”時,它們會被排序(次序由Comparabel或Comparator決定)。TreeMap的特點在於,你得到的結果是經過排序的。TreeMap是唯一的帶有subMap()方法的Map,它可以返回一個子樹。
List |
- 繼承於Collection介面
- 是一種列表
- 是其元素以線性方式儲存,集合中可以存放重複物件,最大特點是元素有序
- 以Array為基礎
主要的兩個實現類:
1.ArrayList
- 長度可以改變的陣列結構。儲存方式類似與陣列,所以訪問速度快,可對元素進行隨機的訪問,向ArrayList()中插入與刪除元素的速度慢
- 適合查
2.LinkedList
- 連結串列資料結構。插入和刪除速度快(因為只需要改變元素存放的下一個元素地址),訪問速度慢(因為通過連結遞迴地往下找)
- 適合增刪
Set |
- 繼承於Collection介面
- 最簡單的一種集合
- 集合中的物件不按特定的方式排序
- 存放的是物件的引用,沒有重複物件
- 以HashMap為基礎,儲存方式是把HashMap中的Key作為Set的對應儲存項
- 擁有和Collection一模一樣的介面
Set set=new HashSet();
String s1=new String("hello");
String s2=s1;
String s3=new String("world");
set.add(s1);
set.add(s2);
set.add(s3);
System.out.println(set.size());//列印集合中物件的數目 為 2
主要的兩個實現類:
1.HashSet
- 按照雜湊演算法來存取集合中的物件,存取速度比較快
- 放到HashSet中的物件需要實現hashCode()方法
2.TreeSet
- 將放入其中的元素按序存放,這就要求你放入其中的物件是可排序的,這就用到了集合框架提供的另外兩個實用類Comparable和Comparator。一個類是可排序的,它就應該實現Comparable介面。有時多個類具有相同的排序演算法,那就不需要在每分別重複定義相同的排序演算法,只要實現Comparator介面即可
【總結】
- 最常用的是ArrayList,HashSet,HashMap,Array
- Collection和Map的區別:Collection型別者,每個位置只有一個元素。 Map型別者,持有 key-value pair,像個小型資料庫
- 集合框架中還有兩個很實用的公用類:Collections和Arrays。Collections提供了對一個Collection容器進行諸如排序、複製、查詢和填充等一些非常有用的方法,Arrays則是對一個數組進行類似的操作