Vector和ArrayList在使用上很是类似,均可用来表示一组数量可变的对象应用的集合,而且能够随机地访问其中的元素。
Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,因为线程的同步必然要影响性能,所以,ArrayList的性能比Vector好。 LinkedList也不是线程安全的。 java
ArrayList和LinkedList区别
对于处理一列数据项,Java提供了两个类ArrayList和LinkedList,ArrayList的内部实现是基于内部数组Object[],因此从概念上讲,它更象数组,但LinkedList的内部实现是基于一组链接的记录,因此,它更象一个链表结构,因此,它们在性能上有很大的差异。
从上面的分析可知,在ArrayList的前面或中间插入数据时,你必须将其后的全部数据相应的后移,这样必然要花费较多时间,因此,当你的操做是在一列数据的后面添加数据而不是在前面或中间,而且须要随机地访问其中的元素时,使用ArrayList会提供比较好的性能
而访问链表中的某个元素时,就必须从链表的一端开始沿着链接方向一个一个元素地去查找,直到找到所需的元素为止,因此,当你的操做是在一列数据的前面或中间添加或删除数据,而且按照顺序访问其中的元素时,就应该使用LinkedList了。
若是在编程中,1,2两种情形交替出现,这时,你能够考虑使用List这样的通用接口,而不用关心具体的实现,在具体的情形下,它的性能由具体的实现来保证。编程
HashTable和HashMap采用相同的存储机制,两者的实现基本一致,不一样的是:
1)、HashMap是非线程安全的,HashTable是线程安全的,内部的方法基本都是synchronized。
2)、HashTable不容许有null值的存在。
在HashTable中调用put方法时,若是key为null,直接抛出NullPointerException。其它细微的差异还有,好比初始化Entry数组的大小等等,但基本思想和HashMap同样。数组
HashSet:
一、HashSet基于HashMap实现,无容量限制。
二、HashSet是非线程安全的。
三、HashSet不保证有序。
HashMap:
一、HashMap采用数组方式存储key,value构成的Entry对象,无容量限制。
二、HashMap基于Key hash查找Entry对象存放到数组的位置,对于hash冲突采用链表的方式来解决。
三、HashMap在插入元素时可能会要扩大数组的容量,在扩大容量时需要从新计算hash,并复制对象到新的数组中。
四、HashMap是非线程安全的。
五、HashMap遍历使用的是Iterator
HashTable
一、HashTable是线程安全的。
二、HashTable中不管是Key,仍是Value都不容许为null。
三、HashTable遍历使用的是Enumeration。安全
TreeSet:
一、TreeSet基于TreeMap实现,支持排序。
二、TreeSet是非线程安全的。
从对HashSet和TreeSet的描述来看,TreeSet和HashSet同样,也是彻底基于Map来实现的,而且都不支持get(int)来获取指定位置的元素(须要遍历获取),另外TreeSet还提供了一些排序方面的支持。例如传入Comparator实现、descendingSet以及descendingIterator等。
TreeMap:
一、TreeMap是一个典型的基于红黑树的Map实现,所以它要求必定要有Key比较的方法,要么传入Comparator实现,要么key对象实现Comparable接口。
二、TreeMap是非线程安全的。并发
Vector,HashTable是线程安全的。性能
ArrayList,LinkedList,HashMap,TreeMap,HashSet,TreeSet都不是线程安全的。spa
java.util.concurrent包提供了映射表、有序集和队列的高效实现,容许并发访问:ConcurrentHashMap,ConcurrentSkipListMap,ConcurrentSkipListSet,ConcurrentLinkedQueue线程
固然对于上述线程不安全的集合也可使用同步包装器Collections.synchronizedList(List<T> list)等,使得集合的方法使用锁加以保护,提供了线程安全的访问。若是在另外一个线程可能进行修改时要对集合进行迭代,仍然须要使用“客户端”锁定。
code