线程安全的集合对象:Vector、HashTable、StringBuffer
线程非安全的集合对象:ArrayList、LinkedList、HashMap、HashSet、StringBulider、TreeSet
相关集合对象比较:
1.Vector、ArrayList、LinkedList
Vector:和ArrayList都是通过数组进行实现,不同的是它支持线程的同步,某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢
ArrayList:当需要在此集合中添加、删除、修改数据时耗费时间比较长,需要移动数组中全部数据的位置,代价太大,但是如果在此集合中查询数据就比较快,通过数组下标进行数据查询,数组本来就有下标,所有查询起来比较快
LinkedList:此集合不适合查询,查询数据需要对集合中的数据进行下标定义,再进行查询,效率低;但对于集合中的数据进行增、删、改效率快,只有把要改变的数据两旁的数据
2、Vector和ArrayList比较:
性能:
ArrayList底层数据结构是数组,适合随机查找和遍历,不适合插入和删除,线程不安全,效率高。。LinkedList底层数据结构是链表, 适合数据的动态插入和删除,随机访问和遍历速度比较慢,线程不安全,效率高
同步:
Vectors是可同步的,是线程安全的。ArrayList是不可同步的,不是线程安全的。所以,一般单线程推荐用ArrayList,多线程中则用Vector
数据增长:
往一个ArrayList或者Vector里插入一个元素时,如果内部数组空间不够,ArrayList或Vector会扩展它的大小。Vector在默认情况下增长一倍的大小,而ArrayList增加50%的大小
3、HashMap\HashTable\HashSet区别
1.HashMap
a. 采用数组方式存储key-value构成的Entry对象,无容量限制;
b. 基于key hash查找Entry对象存放到数组的位置,对于hash冲突采用链表的方式去解决;
c. 在插入元素时,可能会扩大数组的容量,在扩大容量时须要重新计算hash,并复制对象到新的数组中;
d. 是非线程安全的;
e. 遍历使用的是Iterator迭代器;
2、HashTable:
a. 是线程安全的;
b. 无论是key还是value都不允许有null值的存在;在HashTable中调用Put方法时,如果key为null,直接抛出NullPointerException异常;
c. 遍历使用的是Enumeration列举;
3、HashSet:
a. 基于HashMap实现,无容量限制;
b. 是非线程安全的;
c. 不保证数据的有序;
本文介绍了线程安全和非安全的集合对象,如线程安全的Vector、HashTable等,非安全的ArrayList、HashMap等。还对相关集合对象进行比较,包括Vector、ArrayList、LinkedList的性能、同步和数据增长情况,以及HashMap、HashTable、HashSet的区别。
352

被折叠的 条评论
为什么被折叠?



