1、概念:web
2、线程安全(Thread-safe)的集合对象:数组
3、非线程安全的集合对象:安全
4、相关集合对象比较:多线程
Vector和ArrayList在使用上很是类似,均可以用来表示一组数量可变的对象应用的集合,而且能够随机的访问其中的元素。jvm
ArryList和LinkedList的区别:
在处理一列数据项时,Java提供了两个类ArrayList和LinkedList,ArrayList的内部实现是基于内部数组Object[],因此从概念上说它更像数组;然而LinkedList的内部实现是基于一组链接的记录,因此,它更像一个链表结构;因此它们在性能上有很大的差异。
由上可知,在ArrayList的前面或者中间插入数据的时候,必须将其后的全部数据相应的后移,这样要花费较多的时间;因此,当操做是在一列数据的后面添加数据而不是在前面或者中间,并须要随机地访问其中的元素时,使用ArrayList性能比较好。
然而访问链表中的某个元素的时候,就必须从链表的一端开始,沿着链接的方向一个一个元素的去查找,直到找到所需的元素为止,因此,当对一列数据的前面或者中间执行添加或者删除操做时,而且按照顺序访问其中的元素时,要使用LinkedList。
若是在实际的操做中,前面两种状况交替出现,能够考虑使用List这样的通用接口,而不用关心具体的实现,再具体的状况下,它的性能由具体的实现来保证。ide
HashTable、HashMap、HashSet:
HashTable和HashMap采用的存储机制是同样的,不一样的是:
一、HashMap:
a. 采用数组方式存储key-value构成的Entry对象,无容量限制;
b. 基于key hash查找Entry对象存放到数组的位置,对于hash冲突采用链表的方式去解决;
c. 在插入元素时,可能会扩大数组的容量,在扩大容量时需要从新计算hash,并复制对象到新的数组中;
d. 是非线程安全的;
e. 遍历使用的是Iterator迭代器;svg
二、HashTable:
a. 是线程安全的;
b. 不管是key仍是value都不容许有null值的存在;在HashTable中调用Put方法时,若是key为null,直接抛出NullPointerException异常;
c. 遍历使用的是Enumeration列举;性能
三、HashSet:
a. 基于HashMap实现,无容量限制;
b. 是非线程安全的;
c. 不保证数据的有序;ui
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 ; 二、StringBuffer与StringBuilder,他们是字符串变量,是可改变的对象,每当咱们用它们对字符串作操做时,其实是在一个对象上操做的,不像String同样建立一些对象进行操做,因此速度就快了; 三、 StringBuilder:线程非安全的; 四、StringBuffer:线程安全的; 对于String、StringBuffer和StringBulider三者使用的总结: 1.若是要操做少许的数据用 = String 2.单线程操做字符串缓冲区 下操做大量数据 = StringBuilder 3.多线程操做字符串缓冲区 下操做大量数据 = StringBuffer