1. 程式人生 > >【Java 集合類】Hashtable和HashMap、Vector和ArrayList,來說說

【Java 集合類】Hashtable和HashMap、Vector和ArrayList,來說說

環境:
jdk1.8

這兩類(4個類)的比較經常出現在面試中:

解決思路:看原始碼

1.Hashtable和HashMap

1.Hashtable(注意table小寫)裡為了保證執行緒安全,類中方法都增加了synchronized關鍵字;HashMap則沒有,即HashMap執行緒不安全,但是效率HashMap要高。
2.兩者都是存的entry(K-V)結構陣列

Hashtable:Entry< ?,?>[] table;
HashMap:Node< K,V>[] table;
兩者都繼承自Map的Entry< K, V>介面。

2.Vector和ArrayList

1.和上班倆類似Vector裡方法保證執行緒安全,也增加了synchronized關鍵字;ArrayList沒有(只在註釋出現-_-),即ArrayList執行緒不安全,但是效率同樣ArrayList高。
2.兩者內部都是Object陣列:Object [] elementData;
3.Vector有4個建構函式,ArrayList則是3個;Vector多出一個可以傳每次擴容資料量的引數的建構函式。
4.兩者擴容都用grow(int minCapacity)函式:

Vector:預設按照2倍舊資料的空間擴容,如果使用者傳入了擴容引數(capacityIncrement)則按照擴容引數來進行每次擴容:int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity);
ArrayList:預設按照1.5倍

舊資料的空間擴容:int newCapacity = oldCapacity + (oldCapacity >> 1);

TIPS:
Hashtable和Vector都是比較原始的類,不常用。HashMap、ArrayList使用的比較多,如果需要執行緒安全,可以使用Collections工具類中的Collections.synchronizedCollection(c)、Collections.synchronizedMap(c)。