談談Java的集合組件

讓咱們一塊兒談談Java的集合組件java

咱們在使用Java的時候,都會遇到並使用到Java的集合。在這裏經過本身的理解和網上的資源對Java的集合方面的使用作一個簡單的講解和總結。算法

Java主要分爲3個集合組件:Set(集)List(列表)Map(映射)數組

Collection接口:Collection是最基本的集合接口,聲明瞭適用於Java集合的通用方法。SetList都繼承了CollectionMap數據結構

 

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 的經常使用方法: 

添加,刪除操做: 

Object put(Object key, Object value):向集合中加入元素 

Object remove(Object key):刪除與KEY相關的元素 

void putAll(Map t):未來自特定映像的全部元素添加給該映像 

void clear():從映像中刪除全部映射

查詢操做: 

Object get(Object key):得到與關鍵字key相關的值 。Map集合中的鍵對象不容許重複,也就說,任意兩個鍵對象經過equals()方法比較的結果都是false.,可是能夠將任意多個鍵同時映射到同一個值對象上。

 

List按對象進入的順序保存對象,不作排序或編輯操做。Set對每一個對象只接受一次,並使用本身內部的排序方法(一般,你只關心某個元素是否屬於 Set,而不關心它的順序--不然應該使用List)Map一樣對每一個元素保存一份,但這是基於""的,Map也有內置的排序,於是不關心元素添加的順序。若是添加元素的順序對你很重要,應該使用 LinkedHashSet或者LinkedHashMap.

List的功能方法 

實際上有兩種List:一種是基本的ArrayList,其優勢在於隨機訪問元素,另外一種是更強大的LinkedList,它並非爲快速隨機訪問設計的,而是具備一套更通用的方法。

次序是List最重要的特色:它保證維護元素特定的順序。ListCollection添加了許多方法,使得可以向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()方法以確保對象的惟一性。SetCollection有徹底同樣的接口。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類庫中包含了幾種不一樣的MapHashMap, TreeMap, LinkedHashMap, WeakHashMap, IdentityHashMap。它們都有一樣的基本接口Map,可是行爲、效率、排序策略、保存對象的生命週期和斷定「鍵」等價的策略等各不相同。 

執行效率是Map的一個大問題。看看get()要作哪些事,就會明白爲何在ArrayList中搜索「鍵」是至關慢的。而這正是HashMap提升速度的地方。HashMap使用了特殊的值,稱爲「散列碼」(hash code),來取代對鍵的緩慢搜索。「散列碼」是「相對惟一」用以表明對象的int值,它是經過將該對象的某些信息進行轉換而生成的。全部Java對象都能產生散列碼,由於hashCode()是定義在基類Object中的方法。 

HashMapMap基於散列表的實現。插入和查詢「鍵值對」的開銷是固定的。能夠經過構造器設置容量capacity和負載因子load factor,以調整容器的性能。 

LinkedHashMap:相似於HashMap,可是迭代遍歷它時,取得「鍵值對」的順序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一點。而在迭代訪問時發而更快,由於它使用鏈表維護內部次序。 

TreeMap : 基於紅黑樹數據結構的實現。查看「鍵」或「鍵值對」時,它們會被排序(次序由ComparabelComparator決定)TreeMap的特色在 於,你獲得的結果是通過排序的。TreeMap是惟一的帶有subMap()方法的Map,它能夠返回一個子樹。 

WeakHashMap :弱鍵(weak key)MapMap中使用的對象也被容許釋放這是爲解決特殊問題設計的。若是沒有map以外的引用指向某個「鍵」,則此「鍵」能夠被垃圾收集器回收。 

IdentifyHashMap: 使用==代替equals()對「鍵」做比較的hash map。專爲解決特殊問題而設計。

 

總結:

SetListMapJava語言中很重要的三大集合組件,在這上面花大功夫學習掌握它是頗有必要的,由於靈活運用這些集合會對咱們的開發和數據處理有很大的幫助。

相關文章
相關標籤/搜索