java 集合總結

一、Collection集合算法

 

 

 

二、Map集合數組

 

 * 圖片中略掉抽象類安全

 Collection繼承接口Iterable,因此其子類均可經過迭代器遍歷元素。數據結構

 Map 能夠經過entrySet()、keySet()方法,獲得一個Set集合進行迭代器遍歷。多線程

ListIterator能夠向前和向後進行迭代併發

 

1)ArrayList<E>ide

 

數據結構:數組(線性序列)優化

適合操做:根據數據結構,善於隨機訪問元素,可是在其中間插入和移除元素時較慢this

基本介紹:初始化時可設置數組容量大小,當實際元素個數size大於數組容量,對其進行擴容。由於其數spa

                 據結構是數組,每次查詢可根據下標直接查到元素。刪除一個元素時,後面元素統一貫前移

                 一位。

 

2LinkedList<E>

 

數據結構:雙向鏈表   

適合操做:根據數據結構,不善於隨機訪問元素,可是在其中間插入和移除元素時較快

基本介紹:每一個元素都是一個Node,除了元素值位,還有一個指向左右的引用。每次增刪Node,只須要改

                 變左右的引用指向便可,不用移動元素 

Java代碼  收藏代碼

  1. private static class Node<E> {  

  2.     E item;  

  3.     Node<E> next;  

  4.     Node<E> prev;  

  5.   

  6.     Node(Node<E> prev, E element, Node<E> next) {  

  7.         this.item = element;  

  8.         this.next = next;  

  9.         this.prev = prev;  

  10.     }  

  11. }  

 

 

 

 3Vector<E>

 

數據結構:跟ArrayList的數據結構同樣(數組)

適合操做:跟ArrayList同樣因同步的,因此沒有ArrayList

基本介紹:其方法與ArrayList也基本相同,只是在增、刪、改、查等方法前加了synchronized關鍵字。

                 單線程中不需使用,即便使用後臺的編譯期也會進行對其進行優化,消除同步代碼。多線程中

                 通常也不多使用,由於速度比較慢,並且組合操做(若是存在刪除)沒法實現線程安全。


 4Stack<E>棧

 

數據結構:繼承Vector (數組)  ,可用LinkedList鏈表實現。

適合操做:「棧」,先進後出的容器,只有一個口,一端放入元素,同一端取出元素

應用:1)平衡符號:棧中:{{【{(   站外:)}】}} ,從棧中向外彈出元素作比較。

          2)後綴表達式: 表達式a+b*c+(d*e+f)*g 轉成後綴:abc*+de*f+g*+ ,現將abc壓棧,遇到*,bc出棧作

               乘法,,,,

基本介紹: LinkedList可以直接實現棧的全部功能的方法,所以能夠直接將LinkedList做爲棧使用。

Java代碼  收藏代碼

  1. public class StackLinked<T> {   

  2.     private LinkedList<T> linked = new LinkedList<T>();  

  3.       

  4.     public T peek(){ return linked.getFirst(); }  

  5.       

  6.     public T pop(){ return linked.removeFirst(); }  

  7.   

  8.     public void push(T t){ linked.addFirst(t); }  

  9.       

  10.     public boolean isEntry(){ return linked.isEmpty(); }  

  11.       

  12.     @Override  

  13.     public String toString() {return linked.toString();}  

  14.   

  15. }  

 


 5Queue<E> 隊列

 

數據結構:數組(ArrayDeque)、鏈表(LinkedList)

適合操做:隊列,先進先出的容器,從容器的一端放入事物, 從另外一端取出

應用:併發(只是思想)

基本介紹:放入順序與取出順序相同。

Java代碼  收藏代碼

  1. Queue<String> queueLinked = new LinkedList<String>();  

  2. Queue<String> queueArray = new ArrayDeque<String>();  

  


 6PriorityQueue<E> 優先隊列

 

數據結構:堆(數組)。   

適合操做:優先隊列,聲明下一個彈出的元素是最須要的元素(最大值/最小值具備最高優先級)

基本介紹: 根據堆的性質,每次在[0]位置的都是最大或最小的元素。由於要進 行排序因此元素要實現接

                   口Comparator<T>

Java代碼  收藏代碼

  1. public static void main(String[] args) {  

  2.     Queue<Integer> queue = new PriorityQueue<Integer>(Arrays.asList(13,  

  3.             546));  

  4.     while (!queue.isEmpty()) {  

  5.         System.err.println(queue.remove());// 1 3 4 5 6  

  6.     }  

  7. }  

 

 

 

7Deque<E> 雙向隊列

 

數據結構:數組(ArrayDeque)、鏈表(LinkedList)

適合操做:雙向隊列,能夠在任何一端添加或刪除元素

基本介紹:由於ArrayDeque、LinkedList都實現了Deque接口,因此能夠經過向上轉型使用Deque

Java代碼  收藏代碼

  1. Deque<String> dequeLinked = new LinkedList<String>();  

  2. Deque<String> dequeArray = new ArrayDeque<String>();  

 

 

 

 8)HashMap<K,V>  

 

數據結構:散列(數組+單向鏈表)   

適合操做:當get()時使用線性搜索,執行速度會很慢,而HashMap經過散列碼能夠很快定位元素位置。

基本介紹:1)每一個元素都是一個Entry<K,V>對象,其底層經過Entry<K,V>數組來存儲元素,每

                       個Entry<K,V>對象中會有一個next屬性來實現單向鏈表

                  2)經過hash算法(利用K的hashCode)爲每一個Entry的K生成一個hash值,而後根據hash值

                       和數組length算出Entry在數組中的位置。

                  3)不一樣的K可能生成相同的hash值,即會存儲在數組的同一個位置,這時經過for循環用

                        equals比較當前位置的鏈表元素,若是是false將新插入的值放入計算出來的位置,

                        而後next指向oldEntry,若是是false,則替換value

                  4) 裝(負)載因子默認是075,即當數組75%的位置都有值時,對數組進行擴容length*2,而後從新

                      計算每一個元素在數組中的位置。                  

Java代碼  收藏代碼

  1. static class Entry<K,V> implements Map.Entry<K,V> {  

  2.        final K key;  

  3.        V value;  

  4.        Entry<K,V> next;  

  5.        int hash;  

  6.   

  7.        Entry(int h, K k, V v, Entry<K,V> n) {  

  8.            value = v;  

  9.            next = n;  

  10.            key = k;  

  11.            hash = h;  

  12.        }  

  13.   

  14.        public final K getKey() {  

  15.            return key;  

  16.        }  

  17.   

  18.        public final V getValue() {  

  19.            return value;  

  20.        }  

  21.   

  22.        public final V setValue(V newValue) {  

  23.            V oldValue = value;  

  24.            value = newValue;  

  25.            return oldValue;  

  26.        }  

  27.   

  28.        public final boolean equals(Object o) {  

  29.            if (!(o instanceof Map.Entry))  

  30.                return false;  

  31.            Map.Entry e = (Map.Entry)o;  

  32.            Object k1 = getKey();  

  33.            Object k2 = e.getKey();  

  34.            if (k1 == k2 || (k1 != null && k1.equals(k2))) {  

  35.                Object v1 = getValue();  

  36.                Object v2 = e.getValue();  

  37.                if (v1 == v2 || (v1 != null && v1.equals(v2)))  

  38.                    return true;  

  39.            }  

  40.            return false;  

  41.        }  

  42.   

  43.        public final int hashCode() {  

  44.            return Objects.hashCode(getKey()) ^ Objects.hashCode(getValue());  

  45.        }  

  46.   

  47.        public final String toString() {  

  48.            return getKey() + "=" + getValue();  

  49.        }  

  50.   

  51.        void recordAccess(HashMap<K,V> m) {  

  52.        }  

  53.   

  54.        void recordRemoval(HashMap<K,V> m) {  

  55.        }  

  56.    }  

 

 

9HashSet<E> 

 

數據結構:散列

適合操做:無重複元素,能夠快速超找到對象。

基本介紹:HashSet的元素能夠看做是HashMap的key沒有重複元素,查找塊。因此HashSet的底層實現就

                 是HashMap

 

 

10LinkedHashMap<K,V>   

 

數據結構:散列,雙向鏈表

適合操做:具備HashMap的查詢速度,內部使用雙向鏈表維護順序(插入次序),迭代遍歷按插入順序顯

                  示,由於使用鏈表維護內部順序,因此迭代訪問很快。

基本介紹:繼承自HashMap,每一個元素Entry<K,V>多出兩個指向兩邊元素的引用來維護順序。

Java代碼  收藏代碼

  1. private static class Entry<K,V> extends HashMap.Entry<K,V> {  

  2.        Entry<K,V> before, after;  

  3.   

  4.        Entry(int hash, K key, V value, HashMap.Entry<K,V> next) {  

  5.            super(hash, key, value, next);  

  6.        }  

  7.   

  8.        private void remove() {  

  9.            before.after = after;  

  10.            after.before = before;  

  11.        }  

  12.   

  13.        private void addBefore(Entry<K,V> existingEntry) {  

  14.            after  = existingEntry;  

  15.            before = existingEntry.before;  

  16.            before.after = this;  

  17.            after.before = this;  

  18.        }  

  19.   

  20.        void recordAccess(HashMap<K,V> m) {  

  21.            LinkedHashMap<K,V> lm = (LinkedHashMap<K,V>)m;  

  22.            if (lm.accessOrder) {  

  23.                lm.modCount++;  

  24.                remove();  

  25.                addBefore(lm.header);  

  26.            }  

  27.        }  

  28.   

  29.        void recordRemoval(HashMap<K,V> m) {  

  30.            remove();  

  31.        }  

  32.    }  

 

 

 

11)LinkedHashSet<E> 

 

數據結構:散列

適合操做:無重複元素,能夠快速超找到對象。迭代遍歷按插入順序顯示

基本介紹:LinkedHashSet的元素能夠看做是LinkedHashMap的key沒有重複的有序元素,

                 因此LinkedHashSet的底層實現就是LinkedHashMap

 

 

 

12)TreeMap<K,V>  

 

數據結構:紅黑樹

適合操做:對元素自動排序

基本介紹:下面是Entry<K,V>的屬性。TreeMap會對K自動排序,次序由Comparable或Comparator決定,  

                  TreeMap中的元素都是有序的,若是鍵被用於TreeMap,那麼必須實現Comparable

Java代碼  收藏代碼

  1. K key;   

  2. V value;  

  3. Entry<K,V> left = null//左節點  

  4. Entry<K,V> right = null;//右節點  

  5. Entry<K,V> parent; //父節點  

  6. boolean color = BLACK;  

 

 

 

13)TreeSet<E> 

 

數據結構:紅黑樹

基本介紹:經過TreeMap實現,功能參照TreeMap

相關文章
相關標籤/搜索