數組類Array是Java中最基本的一個存儲結構。它用于存儲一組連續的對象或基本類型的數據。其中的元素的類型必須相同。
Array是最有效率的一 種:
1、效率高,但容量固定且無法動態改變。 Array還有一個缺點是,無法判斷其中實際存有多少元素,length只是告訴我們Array的容量。
2、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來實現的。
Set總結:
1、Set實現的基礎是Map(HashMap);
2、Set中的元素是不能重復的,如果使用add(Object obj)方法添加已經存在的對象,則會覆蓋前面的對象; Set里的元素是不能重復的,那么用什么方法來區分重復與否呢? 是用==還是equals()? 它們有何區別? Set里的元素是不能重復的,即不能包含兩個元素e1、e2(e1.equals(e2))。那么用iterator()方法來區分重復與否。 equals()是判讀兩個Set是否相等。==方法決定引用值(句柄)是否指向同一對象。
HashMap、TreeMap、Hashtable:
1、HashMap也用到了哈希碼的算法,以便快速查找一個鍵,TreeMap則是對鍵按序存放,因此它有一些擴展的方法,比如 firstKey(),lastKey()等。
2、Hashtable:不允許空(null)鍵(key)或值(value),Hashtable的方法是Synchronize的,在多個線程訪問 Hashtable時,不需要自己為它的方法實現同步,而HashMap 就必須為之提供外同步。 Hashtable和HashMap采用的hash/rehash算法都大概一樣,所以性能不會有很大的差異。
3、HashMap和Hashtable的區別:HashMap是Hashtable(線程案例的)的輕量級實現(非線程安全的實現),他們都完成了Map接口。主要區別在于HashMap允許空(null)鍵(key)或值(value),非同步,由于非線程安全,效率上可能高于Hashtable。
Map總結:
是一種把鍵對象和值對象進行關聯的容器,Map有兩種比較常用的實現: HashTable、HashMap和TreeMap。