Java之集合框架

本文內容版權來自博客園做者博客,我的只是做爲總結匯總,感謝原文做者,原文地址html

  數組類Array。是JAVA中最基本的一個存儲結構。它用於存儲一組連續的對象或基本類型的數據。其中的元素的類型必須相同。array是最有效率的一種。一、效率高,但容量固定且沒法動態改變。 array還有一個缺點是,沒法判斷其中實際存有多少元素,length只是告訴咱們array的容量。 二、JAVA中有一個Arrays類,專門用來操做array ,提供搜索、排序、複製等靜態方法。 equals():比較兩個array是否相等。array擁有相同元素個數,且全部對應元素兩兩相等。 fill():將值填入array中。 sort():用來對array進行排序。 binarySearch():在排好序的array中尋找元素。 System.arraycopy():array的複製。算法

      Java Collections Framework成員主要包括兩種類型,即:Collection和Map類型。 在Java中提供了Collection和Map接口。其中List和Set繼承了Collection接口;同時用Vector、ArrayList、LinkedList三個類實現List接口,HashSet、TreeSet實現Set接口。直接有HashTable、HashMap、TreeMap實現Map接口。因而可知,Java中用8種類型的基本數據結構來實現其Collections Framework;下面分別進行介紹。數組

      Vector基於Array的List,性能也就不可能超越Array,而且Vector是「sychronized」的,這個也是Vector和ArrayList的惟一的區別。安全

       ArrayList:同Vector同樣是一個基於Array的,可是不一樣的是ArrayList不是同步的。因此在性能上要比Vector優越一些,可是當運行到多線程環境中時,可須要本身在管理線程的同步問題。從其命名中能夠看出它是一種相似數組的形式進行存儲,所以它的隨機訪問速度極快。數據結構

       LinkedList:LinkedList不一樣於前面兩種List,它不是基於Array的,因此不受Array性能的限制。它每個節點(Node)都包含兩方面的內容:1.節點自己的數據(data);2.下一個節點的信息(nextNode)。因此當對LinkedList作添加,刪除動做的時候就不用像基於Array的List同樣,必須進行大量的數據移動。只要更改nextNode的相關信息就能夠實現了因此它適合於進行頻繁進行插入和刪除操做。這就是LinkedList的優點。Iterator只能對容器進行向前遍歷,而 ListIterator則繼承了Iterator的思想,並提供了對List進行雙向遍歷的方法。多線程

       List:1. 全部的List中只能容納單個不一樣類型的對象組成的表,而不是Key-Value鍵值對。例如:[ tom,1,c ]; 2. 全部的List中能夠有相同的元素,例如Vector中能夠有 [ tom,koo,too,koo ]; 3. 全部的List中能夠有null元素,例如[ tom,null,1 ]; 4. 基於Array的List(Vector,ArrayList)適合查詢,而LinkedList(鏈表)適合添加,刪除操做。框架

      HashSet:雖然Set同List都實現了Collection接口,可是他們的實現方式卻大不同。List基本上都是以Array爲基礎。可是Set則是在HashMap的基礎上來實現的,這個就是Set和List的根本區別。HashSet的存儲方式是把HashMap中的Key做爲Set的對應存儲項,這也是爲何在Set中不能像在List中同樣有重複的項的根本緣由,由於HashMap的key是不能有重複的。HashSet能快速定位一個元素,可是放到HashSet中的對象須要實現hashCode()方法0。性能

      TreeSet則將放入其中的元素按序存放,這就要求你放入其中的對象是可排序的,這就用到了集合框架提供的另外兩個實用類Comparable和Comparator。一個類是可排序的,它就應該實現Comparable接口。有時多個類具備相同的排序算法,那就不須要重複定義相同的排序算法,只要實現Comparator接口便可。TreeSet是SortedSet的子類,它不一樣於HashSet的根本就是TreeSet是有序的。它是經過SortedMap來實現的。spa

      Set總結: 1. Set實現的基礎是Map(HashMap); 2. Set中的元素是不能重複的,若是使用add(Object obj)方法添加已經存在的對象,則會覆蓋前面的對象; Set裏的元素是不能重複的,那麼用什麼方法來區分重複與否呢? 是用==仍是equals()? 它們有何區別? Set裏的元素是不能重複的,即不能包含兩個元素e一、e2(e1.equals(e2))。那麼用iterator()方法來區分重複與否。equals()是判讀兩個Set是否相等。==方法決定引用值(句柄)是否指向同一對象。線程

      Map是一種把鍵對象和值對象進行關聯的容器,Map有兩種比較經常使用的實現: HashTable、HashMap和TreeMap。

      HashMap也用到了哈希碼的算法,以便快速查找一個鍵,TreeMap則是對鍵按序存放,所以它有一些擴展的方法,好比firstKey(),lastKey()等。HashMap和Hashtable的區別。 HashMap是Hashtable的輕量級實現(非線程安全的實現),他們都完成了Map接口。主要區別在於HashMap容許空(null)鍵(key)或值(value),非同步,因爲非線程安全,效率上可能高於Hashtable。 Hashtable不容許空(null)鍵(key)或值(value),Hashtable的方法是Synchronize的,在多個線程訪問Hashtable時,不須要本身爲它的方法實現同步,而HashMap 就必須爲之提供外同步。 Hashtable和HashMap採用的hash/rehash算法都大概同樣,因此性能不會有很大的差別。

相關文章
相關標籤/搜索