前言
在Objective-C中,我們常用的容易有三種,分別是NSSet、NSArray、NSDictionary三種(PS:當然了,存儲對象還要分可變和非可變).那么在Java中,容器到底有什么不同呢?下面我們分別來對Java中的各種容器詳情進行說明.
Collection
Collection是一個獨立元素的序列,是一個接口類,也就是說它并沒有直接實現,遵循Collection這個接口類的主要有三個子類接口,分別是List、Set、Queue.List必須按照插入的順序保存元素,而Set不能有重復元素.Queue按照排隊規則來確定對象產生的順序(通常與它們被插入的順序相同,先進先出).Collection接口概括了序列的概念 ---一種存放一組對象的方式.下面我們就看一下實際中具體是如何體現的,如下代碼所示.其中<Integer>表示數組中的元素類型為Integer類型.
Collection<Integer> numberArray = new ArrayList<Integer>();
for (int i = 0; i < 3; i++) {
numberArray.add(i);
}
List
對于List接口時在Collection的基礎上添加上添加了大量的方法,使得可以在List的中間插入和移除元素.通過前言中的Java中集合框架圖對于List接口的具體實現類主要有兩個,一個是ArrayList,另外一個是LinkedList,那么這兩種數組有何不同呢?
- ArrayList是實現了基于動態數組的數據結構,LinkedList基于鏈表的數據結構。
- 對于隨機訪問get和set,ArrayList覺得優于LinkedList,因為LinkedList要移動指針。
- 對于新增和刪除操作add和remove,LinedList比較占優勢,因為ArrayList要移動數據。
下面我們就對List接口類中的一些常用的方法進行簡單的說明概述.
接口方法 | 方法簡介 |
---|---|
contains() | contains()方法是用來確定某個元素是否在當前數組中. |
remove() | remove()是數組刪除一個元素的方法 |
indexOf() | indexOf()可以找到該對象在List中的所處位置的索引編號,這里我要額外的說明一點,那就是上面的三個方法都是基于equals()這個方法的,也就說我們需要注意所找的對象是否是同一對象. |
subList() | 這個方法是用來從數組中截取出一個子數組,我們可以通過參數來確定它需要從什么位置截取到什么位置 |
retainAll() | retainAll()這個方法是一種有效的"交集"操作. |
removeAll() | removeAll()也是基于equals()方法的,它是將List中移除在參數List中的所有元素. |
set() | set()這個方法主要作用是替換,在指定的索引處(第一個參數),用第二個參數替換整個位置的元素.但是這個方法的命名顯得很不合時宜,因為它是和Set類存在潛在沖突的. |
Set
Set不保存重復的元素,這樣我們很容易的詢問某個對象是否在某個Set中.正是因為有這樣的特性,查找就成為Set中最重要的操作,我們經常會使用HashSet來進行快速查找操作.Set具有和Collection一樣的接口,因此沒有額外的的功能,不想前面有兩個不同的List,下面我們看一下遵循Set接口的兩個具體類HashSet和TreeSet的特點.
HashSet | TreeSet | |
---|---|---|
簡介 | HashSet 是哈希表實現的,HashSet中的數據是無序的,可以放入null,但只能放入一個null,兩者中的值都不能重復,就如數據庫中唯一約束。 | TreeSet 是二差樹實現的,Treeset中的數據是自動排好序的,不允許放入null值。 |
排序 | 無序 | TreeSet支持兩種排序方式,自然排序 和定制排序,其中自然排序為默認的排序方式。向TreeSet中加入的應該是同一個類的對象。 |
Map
Map主要作用是一種對象映射成另外的一種對象,在Map中我們通過對象來對對象進行索引,用來索引的對象叫做key,其對應的對象叫做value.這就是我們平時說的鍵值對.下面我們看一下遵循Map接口的兩個具體類HashMap和TreeMap的特點.這兩者的比較類似于上一個模塊的HashSet和TreeSet.
HashMap | TreeMap | |
---|---|---|
簡介 | 基于哈希表實現。使用HashMap要求添加的鍵類明確定義了hashCode()和equals()[可以重寫hashCode()和equals()],為了優化HashMap空間的使用,您可以調優初始容量和負載因子。 | 基于紅黑樹實現。TreeMap沒有調優選項,因為該樹總處于平衡狀態。 |
排序 | 無序 | 適用于按自然順序或自定義順序遍歷鍵(key) |
總結 | HashMap通常比TreeMap快一點(樹和哈希表的數據結構使然),建議多使用HashMap,在需要排序的Map時候才用TreeMap. | 同左 |
本文參考文章:Java——HashSet和TreeSet的區別
本文參考文章:Java中HashMap和TreeMap的區別
本文所有內容詳情可查看Think in Java(Java編程思想)第十一章的持有對象部分,所以還是建議大家去看原書.本文只是作為學習筆記,如有紕漏,歡迎指出.