概述
主要介绍和对比JAVA常用的数据集合
常用数据集合
List结构的集合类:ArrayList类,LinkedList类,Vector类,Stack类
Map结构的集合类:HashMap类,Hashtable类
Set结构的集合类:HashSet类,TreeSet类
Queue结构的集合:Queue接口
集合对比以及使用
1)如果要求线程安全,使用Vector,Hashtable
2)如果不要求线程安全,使用ArrayList,LinkedList,HashMap
3)如果要求键值对,则使用HashMap,Hashtable
4)如果数据量很大,又要求线程安全考虑Vector
集合说明
1.ArrayList: 元素单个,效率高,多用于查询
2.Vector: 元素单个,线程安全,多用于查询
3.LinkedList:元素单个,多用于插入和删除
4.HashMap: 元素成对,元素可为空
5.HashTable: 元素成对,线程安全,元素不可为空
ArrayList
ArrayList底层是Object数组,所以ArrayList具有数组的查询速度快的优点以及增删速度慢的缺点。
LinkedList的底层是一种双向循环链表。在此链表上每一个数据节点都由三部分组成:前指针(指向前面的节点的位置<<<)数据,后指针(指向后面的节点的位置>>>)数据,最后一个节点的后指针指向第一个节点的前指针,形成一个循环。
双向循环链表的查询效率低但是增删效率高。
LinkedList
经常用在增删操作较多而查询操作很少的情况下:队列和堆栈,比如消息队列等, 在JAVA1.5后,collection使用queue来实现队列。
队列:先进先出的数据结构。>>> IN …>>> OUT
栈:后进先出的数据结构。 >>> IN …<<< OUT
使用栈的时候一定不能提供方法让不是最后一个元素的元素获得出栈的机会。
Vector
与ArrayList相似,区别是Vector是重量级的组件,使用使消耗的资源比较多,且Vector是线程安全的.
HashSet(hashMap单独一篇介绍)
hashSet的底层是数组,其查询效率非常高。而且在增加和删除的时候由于运用的hashCode的比较开确定添加元素的位置,所以不存在元素的偏移,所以效率也非常高。因为hashSet查询和删除和增加元素的效率都非常高。
但是hashSet增删的高效率是通过花费大量的空间换来的:因为空间越大,取余数相同的情况就越小,HashSet这种算法会建立许多无用的空间,造成空间的浪费.
使用hashSet类时要注意,如果发生冲突,就会出现遍历整个数组的情况,这样就使得效率非常的低。
如将自定义类用hashSet来添加对象,一定要覆盖hashcode()和equals(),覆盖的原则是保证当两个对象hashcode返回相同的整数,而且equals()返回值为True。
如果没有设定equals(),就会造成返回hashCode虽然结果相同,但在程序执行的过程中会多次地调用equals(),从而影响程序执行的效率。
TreeSet
Java中的TreeSet是Set的一个子类,TreeSet集合是用来对象元素进行排序的,同样他也可以保证元素的唯一。
可以按照任何顺序将元素插入该集合,当对该集合进行迭代时,各个值将自动以排序后的顺序出现。TreeSet中的元素按照升序排列,缺省是按照自然顺序进行排序,意味着TreeSet中的元素要实现Comparable接口,或者有一个自定义的比较器Comparator。
TreeSet底层使用的是TreeMap,TreeMap的底层实现是红黑树.
总结
了解到各个集合的特性,才能在使用的时候游刃有余。
一盏灯, 一片昏黄; 一简书, 一杯淡茶。 守着那一份淡定, 品读属于自己的寂寞。 保持淡定, 才能欣赏到最美丽的风景! 保持淡定, 人生从此不再寂寞。