讓咱們一塊兒談談Java的集合組件java
咱們在使用Java的時候,都會遇到並使用到Java的集合。在這裏經過本身的理解和網上的資源對Java的集合方面的使用作一個簡單的講解和總結。算法
Java主要分爲3個集合組件:Set(集)、List(列表)、Map(映射)。數組
Collection接口:Collection是最基本的集合接口,聲明瞭適用於Java集合的通用方法。Set和List都繼承了Collection,Map。數據結構
Collection接口的方法:性能
boolean add(Object o):向集合中加入一個對象的引用 學習
void clear():刪除集合中全部的對象,即再也不持有這些對象的引用 測試
boolean isEmpty():判斷集合是否爲空 優化
boolean contains(Object o): 判斷集合中是否持有特定對象的引用 spa
Iterartor iterator():返回一個iterator對象,能夠用來遍歷集合中的元素 設計
boolean remove(Object o):從集合中刪除一個對象的引用
int size() :返回集合中元素的數目
Object[] toArray() :返回一個數組,該數組中包括集合中的全部元素
關於:Iterator() 和toArray() 方法都用於集合的全部的元素,前者返回一個Iterator對象,後者返回一個包含集合中全部元素的數組。
Set(集合):Set是最簡單的一種集合。集合中的對象不按特定的方式排序,而且沒有重複對象。
Set接口主要實現了兩個實現類:
HashSet :HashSet類按照哈希算法來存取集合中的對象,存取速度比較快
TreeSet :TreeSet類實現了SortedSet接口,可以對集合中的對象進行排序。
Set 的用法:存放的是對象的引用,沒有重複對象
List(列表):List的特徵是其元素以線性方式存儲,集合中能夠存放重複對象。
List接口主要實現類包括:
Vector():實現自動增加的數組。能夠對元素進行隨機的訪問、插入、修改和刪除。
ArrayList() : 表明長度能夠改變得數組。能夠對元素進行隨機的訪問,向ArrayList()中插入與刪除元素的速度慢。
LinkedList(): 在實現中採用鏈表數據結構。插入和刪除速度快,訪問速度慢。
對於List的隨機訪問來講,就是隻隨機來檢索位於特定位置的元素。List的 get(int index) 方法放回集合中由參數index指定的索引位置的對象,下標從「0」開始。最基本的兩種檢索集合中的全部對象的方法:for循環的get()方法、迭代器iterator。
1 package FirstJavaWorld; 2 3 import java.util.Collection; 4 import java.util.Collections; 5 import java.util.Comparator; 6 import java.util.Vector; 7 8 public class collector { 9 10 @SuppressWarnings("rawtypes") 11 public static void main(String[] args) { 12 Vector vec=new Vector(); 13 vec.clear(); 14 if (vec.isEmpty()) { 15 System.out.println("vec is empty."); 16 } 17 for (int i=1; i<=10; i++) { 18 vec.add(i); 19 } 20 System.out.println("vec size:" + vec.size() + " vec capacity:" + vec.capacity()); 21 for (int i=0; i<vec.size(); i++) { 22 System.out.print(vec.get(i) + " "); 23 } 24 System.out.println(); 25 int num=100; 26 vec.set(1, num); 27 vec.remove(vec.size()-1); 28 for (int i=0; i<vec.size(); i++) { 29 System.out.print(vec.get(i) + " "); 30 } 31 System.out.println(); 32 Vector vec2=new Vector(); 33 int[] an={23,534,123,67,98}; 34 for (int i=0; i<5; i++) { 35 vec2.add(an[i]); 36 } 37 vec.addAll(9, vec2); 38 for (int i=0; i<vec.size(); i++) { 39 System.out.print(vec.get(i) + " "); 40 } 41 System.out.println(); 42 vec.sort(null); 43 for (int i=0; i<vec.size(); i++) { 44 System.out.print(vec.get(i) + " "); 45 } 46 System.out.println(); 47 Comparator c=Collections.reverseOrder(); 48 vec.sort(c); 49 for (int i=0; i<vec.size(); i++) { 50 System.out.print(vec.get(i) + " "); 51 } 52 } 53 }
Map(映射):
Map 是一種把鍵對象和值對象映射的集合,它的每個元素都包含一對鍵對象和值對象。 Map沒有繼承於Collection接口 從Map集合中檢索元素時,只要給出鍵對象,就會返回對應的值對象。
Map 的經常使用方法:
1 添加,刪除操做:
Object put(Object key, Object value):向集合中加入元素
Object remove(Object key):刪除與KEY相關的元素
void putAll(Map t):未來自特定映像的全部元素添加給該映像
void clear():從映像中刪除全部映射
2 查詢操做:
Object get(Object key):得到與關鍵字key相關的值 。Map集合中的鍵對象不容許重複,也就說,任意兩個鍵對象經過equals()方法比較的結果都是false.,可是能夠將任意多個鍵同時映射到同一個值對象上。
List按對象進入的順序保存對象,不作排序或編輯操做。Set對每一個對象只接受一次,並使用本身內部的排序方法(一般,你只關心某個元素是否屬於 Set,而不關心它的順序--不然應該使用List)。Map一樣對每一個元素保存一份,但這是基於"鍵"的,Map也有內置的排序,於是不關心元素添加的順序。若是添加元素的順序對你很重要,應該使用 LinkedHashSet或者LinkedHashMap.
List的功能方法
實際上有兩種List:一種是基本的ArrayList,其優勢在於隨機訪問元素,另外一種是更強大的LinkedList,它並非爲快速隨機訪問設計的,而是具備一套更通用的方法。
次序是List最重要的特色:它保證維護元素特定的順序。List爲Collection添加了許多方法,使得可以向List中間插入與移除元素(這隻推薦LinkedList使用)。一個List能夠生成ListIterator,使用它能夠從兩個方向遍歷List,也能夠從List中間插入和移除元素。
ArrayList:由數組實現的List。容許對元素進行快速隨機訪問,可是向List中間插入與移除元素的速度很慢。ListIterator只應該用來由後向前遍歷 ArrayList,而不是用來插入和移除元素。由於那比LinkedList開銷要大不少。
LinkedList :對順序訪問進行了優化,向List中間插入與刪除的開銷並不大。隨機訪問則相對較慢(使用ArrayList代替)。還具備下列方法:addFirst(), addLast(), getFirst(), getLast(), removeFirst() 和 removeLast(), 這些方法 (沒有在任何接口或基類中定義過)使得LinkedList能夠看成堆棧、隊列和雙向隊列使用。
Set的功能方法
Set具備與Collection徹底同樣的接口,所以沒有任何額外的功能,不像前面有兩個不一樣的List。實際上Set就是Collection,只是行爲不一樣(這是繼承與多態思想的典型應用:表現不一樣的行爲)。Set不保存重複的元素(至於如何判斷元素相同則較爲負責)
存入Set的每一個元素都必須是惟一的,由於Set不保存重複元素。加入Set的元素必須定義equals()方法以確保對象的惟一性。Set與Collection有徹底同樣的接口。Set接口不保證維護元素的次序。
HashSet:爲快速查找設計的Set。存入HashSet的對象必須定義hashCode()。
TreeSet: 保存次序的Set, 底層爲樹結構。使用它能夠從Set中提取有序的序列。
LinkedHashSet:具備HashSet的查詢速度,且內部使用鏈表維護元素的順序(插入的次序)。因而在使用迭代器遍歷Set時,結果會按元素插入的次序顯示。
Map的功能方法
方法put(Object key, Object value)添加一個「值」(想要得東西)和與「值」相關聯的「鍵」(key)(使用它來查找)。方法get(Object key)返回與給定「鍵」相關聯的「值」。能夠用containsKey()和containsValue()測試Map中是否包含某個「鍵」或「值」。 標準的Java類庫中包含了幾種不一樣的Map:HashMap, TreeMap, LinkedHashMap, WeakHashMap, IdentityHashMap。它們都有一樣的基本接口Map,可是行爲、效率、排序策略、保存對象的生命週期和斷定「鍵」等價的策略等各不相同。
執行效率是Map的一個大問題。看看get()要作哪些事,就會明白爲何在ArrayList中搜索「鍵」是至關慢的。而這正是HashMap提升速度的地方。HashMap使用了特殊的值,稱爲「散列碼」(hash code),來取代對鍵的緩慢搜索。「散列碼」是「相對惟一」用以表明對象的int值,它是經過將該對象的某些信息進行轉換而生成的。全部Java對象都能產生散列碼,由於hashCode()是定義在基類Object中的方法。
HashMap:Map基於散列表的實現。插入和查詢「鍵值對」的開銷是固定的。能夠經過構造器設置容量capacity和負載因子load factor,以調整容器的性能。
LinkedHashMap:相似於HashMap,可是迭代遍歷它時,取得「鍵值對」的順序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一點。而在迭代訪問時發而更快,由於它使用鏈表維護內部次序。
TreeMap : 基於紅黑樹數據結構的實現。查看「鍵」或「鍵值對」時,它們會被排序(次序由Comparabel或Comparator決定)。TreeMap的特色在 於,你獲得的結果是通過排序的。TreeMap是惟一的帶有subMap()方法的Map,它能夠返回一個子樹。
WeakHashMap :弱鍵(weak key)Map,Map中使用的對象也被容許釋放: 這是爲解決特殊問題設計的。若是沒有map以外的引用指向某個「鍵」,則此「鍵」能夠被垃圾收集器回收。
IdentifyHashMap: : 使用==代替equals()對「鍵」做比較的hash map。專爲解決特殊問題而設計。
總結:
Set、List和Map是Java語言中很重要的三大集合組件,在這上面花大功夫學習掌握它是頗有必要的,由於靈活運用這些集合會對咱們的開發和數據處理有很大的幫助。