java容器類總結


1.java容器分類圖

  說明:左圖為簡化圖(其中粗線部分是重點的容器),右圖為完整容器分類圖

                         

 

2.容器類接口和抽象容器類

 

2.1 說明

  容器接口是容器的基礎。使用接口可以將容器的實現與容器接口分開,因而可以使用相同的方法訪問容器而不需關心容器具體的數據結構。

  同理,Iterator接口也使用戶能夠使用相同的方法訪問不同的容器類。

 

2.2 容器接口(Collection,Map,Iterator)

  1)collection接口

    * boolean add(Object obj): 添加對象,集合發生變化則返回true
    * Iterator iterator():返回Iterator接口的對象
    * int size()
    * boolean isEmpty()
    * boolean contains(Object obj)
    * void clear()
    * <T> T[] toArray(T[] a)

  2)Map接口(存放鍵值對,Map中的值也可以是一個容器)

    * Object get(Object key)
    * Object put(Object key, Object value)
    * Set keySet() : returns the keys set      Set<K> keySet()
    * Set entrySet(): returns mappings set    Set<Map.Entry<K,V>> entrySet()
    * containsKey()
    * containsValue() 

  3)Iterator接口

    * Object next()
    * boolean hasNext()
    * void remove()

   注意:remove函數不能連續執行多次,否則返回IllegalStateException 

             ( if the next method has not yet been called, or the remove method has already been called after the last call to the next method.)

      通常用法:

  Iterator it=collection.iterator();
    while(it.hasNext())
    {
     Object obj=it.next();
     //do something 
    }

 

2.3 子接口(List,Set,ListIterator,SortedMap,SortedSet)

  1)List(有順序可以重復,有順序所以操作時可以在方法中加入索引參數,如下:)

  * boolean add(E element)
  * void add(int index, E element)
  * E set(int index, E element)
  * E get(int index);

  2)Set(無順序不可以重復,無序因而不能通過索引操作對象)

  3)ListIterator(Iterator for List,List是雙向表,因而在Iterator上增加了一些新的方法,允許traverse the List in either direction)

  * boolean hasPrevious();
  * E previous();
  * int previousIndex()

  4) SortedMap

  說明:保證按照鍵的升序排列的映射,可以按照鍵的自然順序( Comparable 接口)進行排序, 或者通過創建有序映射時提供的比較器進行排序
  (A Map that further provides a total ordering on its keys. The map is ordered according to the natural ordering of its keys, or by a Comparator typically provided at sorted map creation time)
  public interface SortedMap<K,V>extends Map<K,V>

  * Comparator comparator()
  * Object firstKey()
  * Object lastKey()


  5)SortedSet  

  主要用於排序操作,實現此接口的子類都是排序的子類

 public interface SortedSet<E>extends Set<E>
  * Comparator comparator()
  * E first() :返回第一個元素
  * E last()
* SortedSet<E> headSet(E toElement): 返回less than toElement
  *
SortedSet<E> tailSet(E fromElement)
  *
SortedSet<E> subSet(E fromElement)

 

2.4抽象容器類

  1)說明:使用抽象容器類可以方便的定義類,而不用在每個類中都實現容器接口container 中的所有的方法

  2)包含:

   * AbstractCollection      public abstract class AbstractCollection<E>extends Objectimplements Collection<E>
   * AbstractList              public abstract class AbstractList<E>extends AbstractCollection<E>implements List<E>
   * AbstractSet           public abstract class AbstractSet<E>extends AbstractCollection<E>implements Set<E>
  * AbstactMap                public abstract class AbstractMap<K,V>extends Object implements Map<K,V>
   * AbstractSequentialList    public abstract class AbstractSequentialList<E> extends AbstractList<E>

 

 

3.具體容器類

3.1概括

1)collection: ArrayList,LinkedLsit,Vector,Stack

         TreeSet,HashSet,LinkedHashSet

2) Map:     HashMap,LinkedHashMap,WeakHashMap, TreeMap, HashTable, IdentityHashTable(其中key的比較是通過==而不是equals)

 

3.2常用的容器類

1)ArrayList LinkedList(均非同步,多線程時需要考慮線程安全問題),Vector(同步),Stack

    1. List 接口支持通過索引的方法來訪問元素:ArrayList 隨機訪問快改慢;LinkedList改快隨機訪問慢;Vector實現了同步,因而比ArrayList慢

    2. LinkedList使用雙向鏈表實現LinkedList提供額外的get,remove,insert方法在LinkedList的首部或尾部。這些操作使LinkedList可被用作堆棧(stack),隊列(queue)或雙向隊列(deque)。

    3. ArrayList沒有定義增長算法,當需要插入大量元素是,可調用ensureCapacity方法提高添加效率

      4. Vector類似與ArrayList,但是是同步的,多線程安全(另外一點區別是ArrayList擴容時默認增長一半,Vector增長一倍)。無論是單線程還是多線程,Vector都比ArrayList慢

    5. Stack繼承自Vector,實現一個后進先出的堆棧

    6.若需要實現同步可以調用Collections工具類的synchronizedList方法,如下:

List list = Collections.synchronizedList(new ArrayList());
synchronized(list) {
      Iterator i = list.iterator(); // Must be in synchronized block
      while (i.hasNext())
          foo(i.next());
  }
或者:
List list = Collections.synchronizedList(new LinkedList());

   7.定義如下:(注意LinkedList實現了Deque)

public class ArrayList<E>extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, Serializable
public class LinkedList<E>extends AbstractSequentialList<E>implements List<E>, Deque<E>, Cloneable, Serializable
public class Vector<E>extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, Serializable

  

2)TreeSet, HashSet, LinkedHashSet(HashSet,TreeSet不是線程安全的)

  1. TreeSet是SortedSet接口的唯一實現類,TreeSet可以確保集合元素處於排序狀態,效率很高,可提高程序的效率;TreeSet通過compareTo或者compare排序,因而只要值相等即使equals不等(不同對象)也不能加到集合中(fails to obey Set interface)

  2. HashSet,效率很高,和TreeSet不同的是通過比較對象的equals區分不同對象,這樣不同的對象可以不被重復的加入到集合中。

     hashCode()函數不好確定,對象默認的hashCode函數試對象的內存地址值,hashCode函數的好壞是HashSet性能的關鍵。

  3. LinkedHashSet,和HashSet相同,同樣是根據元素的hashCode值來決定元素的存儲位置,但是它同時使用鏈表維護元素的次序。LinkedHashSet在迭代訪問Set中的全部元素時,性能比HashSet好,但是插入時性能稍微遜色於HashSet。

  4. Set可以插入null,最多一個null

 

3) HashMap(非同步), HashTable(線程安全), TreeMap,  WeakHashMap

  1.HashTable與HashMap區別:(詳情請查看HashTable與HashMap

                 1) Hashtable繼承自Dictionary類,而HashMap繼承自AbstractMap類。但二者都實現了Map接口。

                 2) Hashtable 中的方法是Synchronize的,而HashMap中的方法在缺省情況下是非Synchronize

                 3)Hashtable中,key和value都不允許出現null值;HashMap中,null可以作為鍵,這樣的鍵只有一個;可以有一個或多個鍵所對應 的值為null

                 4) HashTable直接使用對象的hashCode。而HashMap重新計算hash值。

  2. WeakHashMap是一種改進的HashMap,它對key實行“弱引用”,WeakHashMap使用元素的引用而不是值作為key,也就是說必須在引用相同(a==b)的情況下才能找到相關的值。另外,如果一個key不再被外部所引用,那么該key可以被GC回收。

    3. TreeMapSortedMap接口的基於紅黑樹的實現。此類保證了映射按照升序順序排列關鍵字, 根據使用的構造方法不同,可能會按照鍵的類的自然順序進行排序

    4.定義如下:

public class Hashtable  extends Dictionary  implements Map, Cloneable, Serializable    
public class HashMap  extends AbstractMap  implements Map, Cloneable, Serializable 
public class TreeMap<K,V>extends AbstractMap<K,V>implements NavigableMap<K,V>, Cloneable, Serializable

 

4.容器類使用補充

  1)使用抽象編程思想,創建時使用父類引用指向子類對象,返回時返回抽象接口

  2)如果涉及到堆棧,隊列等操作,應該考慮用List,對於需要快速插入,刪除元素,應該使用LinkedList,如果需要快速隨機訪問元素,應該使用ArrayList。

  3)如果程序在單線程環境中使用非同步的類,其效率較高

  4)可以使用Collections 工具類中unmodifiableList/unmodifiableMap/unmodifiableSet/unmodifiableSortedMap/unmodifiableSortedSet等創建不能修改的List,Map,List等

  5)可以使用Collections工具類中Collections.synchronizedList(new ArrayList())等實現同步

  6) 可以使用Arrays.equal()判斷兩個數組是否相等

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM