在编写java程序中,咱们最经常使用的除了八种基本数据类型,String对象外还有一个集合类,在咱们的的程序中处处充斥着集合类的身影!java中集合你们族的成员实在是太丰富了,有经常使用的ArrayList、HashMap、HashSet,也有不经常使用的Stack、Queue,有线程安全的Vector、HashTable,也有线程不安全的LinkedList、TreeMap等等!java
上面的图展现了整个集合你们族的成员以及他们之间的关系。下面就上面的各个接口、基类作一些简单的介绍(主要介绍各个集合的特色。区别),更加详细的介绍会在不久的未来一一讲解。数组
Collection接口是最基本的集合接口,它不提供直接的实现,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。Collection所表明的是一种规则,它所包含的元素都必须遵循一条或者多条规则。若有些容许重复而有些则不能重复、有些必需要按照顺序插入而有些则是散列,有些支持排序可是有些则不支持。安全
在Java中全部实现了Collection接口的类都必须提供两套标准的构造函数,一个是无参,用于建立一个空的Collection,一个是带有Collection参数的有参构造函数,用于建立一个新的Collection,这个新的Collection与传入进来的Collection具有相同的元素。数据结构
List接口为Collection直接接口。List所表明的是有序的Collection,即它用某种特定的插入顺序来维护元素顺序。用户能够对列表中每一个元素的插入位置进行精确地控制,同时能够根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。实现List接口的集合主要有:ArrayList、LinkedList、Vector、Stack。框架
ArrayList是一个动态数组,也是咱们最经常使用的集合。它容许任何符合规则的元素插入甚至包括null。每个ArrayList都有一个初始容量(10),该容量表明了数组的大小。随着容器中的元素不断增长,容器的大小也会随着增长。在每次向容器中增长元素的同时都会进行容量检查,当快溢出时,就会进行扩容操做。因此若是咱们明确所插入元素的多少,最好指定一个初始容量值,避免过多的进行扩容操做而浪费时间、效率。异步
size、isEmpty、get、set、iterator 和 listIterator 操做都以固定时间运行。add 操做以分摊的固定时间运行,也就是说,添加 n 个元素须要 O(n) 时间(因为要考虑到扩容,因此这不仅是添加元素会带来分摊固定时间开销那样简单)。函数
ArrayList擅长于随机访问。同时ArrayList是非同步的。性能
一样实现List接口的LinkedList与ArrayList不一样,ArrayList是一个动态数组,而LinkedList是一个双向链表。因此它除了有ArrayList的基本操做方法外还额外提供了get,remove,insert方法在LinkedList的首部或尾部。测试
因为实现的方式不一样,LinkedList不能随机访问,它全部的操做都是要按照双重链表的须要执行。在列表中索引的操做将从开头或结尾遍历列表(从靠近指定索引的一端)。这样作的好处就是能够经过较低的代价在List中进行插入和删除操做。spa
与ArrayList同样,LinkedList也是非同步的。若是多个线程同时访问一个List,则必须本身实现访问同步。一种解决方法是在建立List时构造一个同步的List:
List list = Collections.synchronizedList(new LinkedList(...));
与ArrayList类似,可是Vector是同步的。因此说Vector是线程安全的动态数组。它的操做与ArrayList几乎同样。
Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被看成堆栈使用。基本的push和pop 方法,还有peek方法获得栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚建立后是空栈。
Set是一种不包括重复元素的Collection。它维持它本身的内部排序,因此随机访问没有任何意义。与List同样,它一样运行null的存在可是仅有一个。因为Set接口的特殊性,全部传入Set集合中的元素都必须不一样,同时要注意任何可变对象,若是在对集合中元素进行操做时,致使e1.equals(e2)==true,则一定会产生某些问题。实现了Set接口的集合有:EnumSet、HashSet、TreeSet。
是枚举的专用Set。全部的元素都是枚举类型。
HashSet堪称查询速度最快的集合,由于其内部是以HashCode来实现的。它内部元素的顺序是由哈希码来决定的,因此它不保证set 的迭代顺序;特别是它不保证该顺序恒久不变。
基于TreeMap,生成一个老是处于排序状态的set,内部以TreeMap来实现。它是使用元素的天然顺序对元素进行排序,或者根据建立Set 时提供的 Comparator
进行排序,具体取决于使用的构造方法。
Map与List、Set接口不一样,它是由一系列键值对组成的集合,提供了key到Value的映射。同时它也没有继承Collection。在Map中它保证了key与value之间的一一对应关系。也就是说一个key对应一个value,因此它不能存在相同的key值,固然value值能够相同。实现map的有:HashMap、TreeMap、HashTable、Properties、EnumMap。
以哈希表数据结构实现,查找对象时经过哈希函数计算其位置,它是为快速查询而设计的,其内部定义了一个hash表数组(Entry[] table),元素会经过哈希转换函数将元素的哈希地址转换成数组中存放的索引,若是有冲突,则使用散列链表的形式将全部相同哈希地址的元素串起来,可能经过查看HashMap.Entry的源码它是一个单链表结构。
键以某种排序规则排序,内部以red-black(红-黑)树数据结构实现,实现了SortedMap接口
也是以哈希表数据结构实现的,解决冲突时与HashMap也同样也是采用了散列链表的形式,不过性能比HashMap要低
队列,它主要分为两大类,一类是阻塞式队列,队列满了之后再插入元素则会抛出异常,主要包括ArrayBlockQueue、PriorityBlockingQueue、LinkedBlockingQueue。另外一种队列则是双端队列,支持在头、尾两端插入和移除元素,主要包括:ArrayDeque、LinkedBlockingDeque、LinkedList。
出处:http://blog.csdn.net/softwave/article/details/4166598
1,vector是线程同步的,因此它也是线程安全的,而arraylist是线程异步的,是不安全的。若是不考虑到线程的安全因素,通常用arraylist效率比较高。
2,若是集合中的元素的数目大于目前集合数组的长度时,vector增加率为目前数组长度的100%,而arraylist增加率为目前数组长度的50%.如过在集合中使用数据量比较大的数据,用vector有必定的优点。
3,若是查找一个指定位置的数据,vector和arraylist使用的时间是相同的,都是0(1),这个时候使用vector和arraylist均可以。而若是移动一个指定位置的数据花费的时间为0(n-i)n为总长度,这个时候就应该考虑到使用linklist,由于它移动一个指定位置的数据所花费的时间为0(1),而查询一个指定位置的数据时花费的时间为0(i)。
ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增长和插入元素,都容许直接序号索引元素,可是插入数据要设计到数组元素移动等内存操做,因此索引数据快插入数据慢,Vector因为使用了synchronized方法(线程安全)因此性能上比ArrayList要差,LinkedList使用双向链表实现存储,按序号索引数据须要进行向前或向后遍历,可是插入数据时只须要记录本项的先后项便可,因此插入数度较快!
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList以为优于LinkedList,由于LinkedList要移动指针。
3.对于新增和删除操做add和remove,LinedList比较占优点,由于ArrayList要移动数据。
这一点要看实际状况的。若只对单条数据插入或删除,ArrayList的速度反而优于LinkedList。但如果批量随机的插入删除数据,LinkedList的速度大大优于ArrayList. 由于ArrayList每插入一条数据,要移动插入点及以后的全部数据。
一、HashMap经过hashcode对其内容进行快速查找,而TreeMap中全部的元素都保持着某种固定的顺序,若是你须要获得一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。HashMap中元素的排列顺序是不固定的)。
二、 HashMap经过hashcode对其内容进行快速查找,而TreeMap中全部的元素都保持着某种固定的顺序,若是你须要获得一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。集合框架”提供两种常规的Map实现:HashMap和TreeMap (TreeMap实现SortedMap接口)。
三、在Map 中插入、删除和定位元素,HashMap 是最好的选择。但若是您要按天然顺序或自定义顺序遍历键,那么TreeMap会更好。使用HashMap要求添加的键类明肯定义了hashCode()和 equals()的实现。 这个TreeMap没有调优选项,由于该树总处于平衡状态。
一、历史缘由:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现 。
二、同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的 。
三、值:只有HashMap可让你将空值做为一个表的条目的key或value 。
一、对于随机查询与迭代遍历操做,数组比全部的容器都要快。因此在随机访问中通常使用ArrayList
二、LinkedList使用双向链表对元素的增长和删除提供了很是好的支持,而ArrayList执行增长和删除元素须要进行元素位移。
三、对于Vector而已,咱们通常都是避免使用。
四、将ArrayList当作首选,毕竟对于集合元素而已咱们都是进行遍历,只有当程序的性能由于List的频繁插入和删除而下降时,再考虑LinkedList。
一、HashSet因为使用HashCode实现,因此在某种程度上来讲它的性能永远比TreeSet要好,尤为是进行增长和查找操做。
三、虽然TreeSet没有HashSet性能好,可是因为它能够维持元素的排序,因此它仍是存在用武之地的。
一、HashMap与HashSet一样,支持快速查询。虽然HashTable速度的速度也不慢,可是在HashMap面前仍是稍微慢了些,因此HashMap在查询方面能够取代HashTable。
二、因为TreeMap须要维持内部元素的顺序,因此它一般要比HashMap和HashTable慢。