Java中各類集合(字符串類)的線程安全性!!!數組
1、概念:安全
2、線程安全(Thread-safe)的集合對象:多線程
3、非線程安全的集合對象:jvm
4、相關集合對象比較:ide
Vector和ArrayList在使用上很是類似,均可以用來表示一組數量可變的對象應用的集合,而且能夠隨機的訪問其中的元素。性能
HashTable、HashMap、HashSet:
HashTable和HashMap採用的存儲機制是同樣的,不一樣的是:
一、HashMap:
a. 採用數組方式存儲key-value構成的Entry對象,無容量限制;
b. 基於key hash查找Entry對象存放到數組的位置,對於hash衝突採用鏈表的方式去解決;
c. 在插入元素時,可能會擴大數組的容量,在擴大容量時需要從新計算hash,並複製對象到新的數組中;
d. 是非線程安全的;
e. 遍歷使用的是Iterator迭代器;ui
二、HashTable:
a. 是線程安全的;
b. 不管是key仍是value都不容許有null值的存在;在HashTable中調用Put方法時,若是key爲null,直接拋出NullPointerException異常;
c. 遍歷使用的是Enumeration列舉;spa
三、HashSet:
a. 基於HashMap實現,無容量限制;
b. 是非線程安全的;
c. 不保證數據的有序;線程
TreeSet、TreeMap:
TreeSet和TreeMap都是徹底基於Map來實現的,而且都不支持get(index)來獲取指定位置的元素,須要遍從來獲取。另外,TreeSet還提供了一些排序方面的支持,例如傳入Comparator實現、descendingSet以及descendingIterator等。
一、TreeSet:
a. 基於TreeMap實現的,支持排序;
b. 是非線程安全的;對象
二、TreeMap:
a. 典型的基於紅黑樹的Map實現,所以它要求必定要有key比較的方法,要麼傳入Comparator比較器實現,要麼key對象實現Comparator接口;
b. 是非線程安全的;
StringBuffer和StringBulider:
StringBuilder與StringBuffer都繼承自AbstractStringBuilder類,在AbstractStringBuilder中也是使用字符數組保存字符串。
一、在執行速度方面的比較:StringBuilder > StringBuffer ;
二、他們都是字符串變量,是可改變的對象,每當咱們用它們對字符串作操做時,其實是在一個對象上操做的,不像String同樣建立一些對象進行操做,因此速度快;
三、 StringBuilder:線程非安全的;
四、StringBuffer:線程安全的;
對於String、StringBuffer和StringBulider三者使用的總結:
1.若是要操做少許的數據用 = String
2.單線程操做字符串緩衝區 下操做大量數據 = StringBuilder
3.多線程操做字符串緩衝區 下操做大量數據 = StringBuffer