Vector和ArrayList的區別

taozihk發表於2016-05-17

Vector和ArrayList區別


 在使用上非常相似,都可用來表示一組數量可變的物件應用的集合,並且可以隨機地訪問其中的元素
 Vector的方法都是同步的(Synchronized),是執行緒安全的(thread-safe),而ArrayList的方法不是,由於執行緒的同步必然要影響效能,因此,ArrayList的效能比Vector
 當VectorArrayList中的元素超過它的初始大小時,Vector會將它的容量翻倍,而ArrayList只增加50%的大小,這樣,ArrayList就有利於節約記憶體空間。


Hashtable和HashMap區別


1.Hashtable是Dictionary的子類,HashMap是Map介面的一個實現類;
2.Hashtable中的方法是同步的,而HashMap中的方法在預設情況下是非同步的。即是說,在多執行緒應用程式中,不用專門的操作就安全地可以使用Hashtable了;而對於HashMap,則需要額外的同步機制。但HashMap的同步問題可通過Collections的一個靜態方法得到解決:
Map Collections.synchronizedMap(Map m)
這個方法返回一個同步的Map,這個Map封裝了底層的HashMap的所有方法,使得底層的HashMap即使是在多執行緒的環境中也是安全的。
3.在HashMap中,null可以作為鍵,這樣的鍵只有一個;可以有一個或多個鍵所對應的值為null。當get()方法返回null值時,即可以表示HashMap中沒有該鍵,也可以表示該鍵所對應的值為null。因此,在HashMap中不能由get()方法來判斷HashMap中是否存在某個鍵,而應該用containsKey()方法來判斷。

4、ConcurrentHashMap具體是怎麼實現執行緒安全的呢,肯定不可能是每個方法加synchronized,那樣就變成了HashTable。
從ConcurrentHashMap程式碼中可以看出,它引入了一個“分段鎖”的概念,具體可以理解為把一個大的Map拆分成N個Segment(類似HashTable),根據key.hashCode()來決定把key放到哪個HashTable中。
在ConcurrentHashMap中,就是把Map分成了N個Segment,put和get的時候,都是現根據key.hashCode()算出放到哪個Segment中:


ArrayList和LinkedList區別


 對於處理一列資料項,Java提供了兩個類ArrayListLinkedList,ArrayList的內部實現是基於內部陣列Object[],所以從概念上講,它更象陣列,但LinkedList的內部實現是基於一組連線的記錄,所以,它更象一個連結串列結構,所以,它們在效能上有很大的差別。
 從上面的分析可知,在ArrayList的前面或中間插入資料時,你必須將其後的所有資料相應的後移,這樣必然要花費較多時間,所以,當你的操作是在一列資料的後面新增資料而不是在前面或中間,並且需要隨機地訪問其中的元素時,使用ArrayList會提供比較好的效能
 而訪問連結串列中的某個元素時,就必須從連結串列的一端開始沿著連線方向一個一個元素地去查詢,直到找到所需的元素為止,所以,當你的操作是在一列資料的前面或中間新增或刪除資料,並且按照順序訪問其中的元素時,就應該使用LinkedList了。
 如果在程式設計中,1,2兩種情形交替出現,這時,你可以考慮使用List這樣的通用介面,而不用關心具體的實現,在具體的情形下,它的效能由具體的實現來保證。

 配置集合類的初始大小
 在Java集合框架中的大部分類的大小是可以隨著元素個數的增加而相應的增加的,我們似乎不用關心它的初始大小,但如果我們考慮類的效能問題時,就一定要考慮儘可能地設定好集合物件的初始大小,這將大大提高程式碼的效能。
 比如,Hashtable預設的初始大小為101,載入因子為0.75,即如果其中的元素個數超過75個,它就必須增加大小並重新組織元素,所以,如果你知道在建立一個新的Hashtable物件時就知道元素的確切數目如為110,那麼,就應將其初始大小設為110/0.75=148,這樣,就可以避免重新組織記憶體並增加大小

相關文章