星期三, 5月 08, 2013

[Java] Set, Map and List


   在Java當中的資料型態Set 以及Map,以及Linked List 跟ArrayList的差別 
首先我先列出Collection 跟Map的大致架構

Collection 
├List 
│├LinkedList 
│├ArrayList 
│└Vector 
│ └Stack 
└Set 
Map 
├Hashtable 
├HashMap 
└WeakHashMap 

  • Collection 為基本的介面, 定義了一些基礎操作, 一個 collection代表一組物件 (objects). 有些物件可以重複有些不行. 有些可以排序有些不行.

          不過基本上又分做兩類, 一個是 List一個是 Set.

  • List 為有順序性的 Collection, 也因此允許重複的物件存於其中.
  • LinkedList 繼承 List, 他是雙向的 List(FIFO, FILO), 也因此可透過他實作 Stack, Queue,不過 LinkedList並沒有使用 synchronize方式存取.
          可用此方式操作 List   list   =   Collections.synchronizedList(new   LinkedList());
  • ArrayList 實作了 List, 然而也提供了動態陣列大小的操作 (這邊我自己覺得有點類似C++的動態陣列),如 size, isEmpty, get, set, iterator, listIterator operations均是常數時間,然而add則是O(n).
          同樣他也是沒有使用synchronize方式存取.
  • Vector 跟 ArrayList類似, 不過他是有進行同步處理的,因此要處理 ConcurrentModificationException,此exception.
  • Stack 繼承 Vector, 並且提供了一些額外的方法, 如 peek.
  • Set 不能包含重複的物件, 即是兩個物件 objec1, object2同時存在此set的話, 則o1.equals(o2)則為false.
  下面則是 Map分類.
  • Map 提供Key->Value的對應關係, key不能重複, 一個 key對應一個 value(object), 這邊我們常用所謂的 keySet(), 就是代表 Map當中的 key只能唯一.
  • HashTable 實作了 Map,提供了 Key-> Value的方式, 而且他是同步(synchronize)的!
  • HashMap 跟 HashTable類似, 不過他是非同步可進行存取的.
  • WeakHashMap 跟 HashMap類似, 如果他其中的 key不再被引用,他將會被回收.

  如果要使用 Stack, Queue等實作, 若要快速插入, 刪除元件,應該使用 LinkedList, 若要快速存取其中物件,應該使用 ArrayList.

  而若沒有同步存取問題, 可以使用非同步的型態如 HashMap, 如果有就要用同步的資料型態.


沒有留言: