强大的Collection集合框架
2017-05-04陈浩鑫刘艳华张桂娟
陈浩鑫+刘艳华+张桂娟
摘 要:Java,是由Sun公司于1995年推出的编程语言。在Java语言中,不管是大编程项目也好,小编程项目也好,为了达到方便的目的,我们都要用到集合框架。集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。任何集合框架都包含三大块内容:对外的接口、接口的实现和对集合运算的算法。
关键词:集合框架;集合;Collection
在Java中,Collection集合接口是Collection层次结构中的根接口。Collection表示一组对象,这些对象也称为collection的元素。一些Collection是有序、允许有重复元素的,而另一些则是无序的、不允许有重复元素的。由于JDK不提供此接口的任何直接实现,因此它提供更具体的子接口来进行集合的实现,如Set和List。此接口通常用来传递Collection,并在需要最大普遍性的地方操作这些Collection。所有通用的Collection实现类(通常通过它的一个子接口间接实现Collection)应该提供两个“标准”构造方法:一个是无参构造方法,用于创建空collection;另一个是带有Collection类型单参数的构造方法,用于创建一个具有与其参数相同元素新的Collection。
如果仔细划分的话,Collection接口下的两个子接口list和set又具有几个我们经常使用的具体实现类。在list接口下有底层是链表结构的LinkedList,有底层是数组的ArrayList、Vector,为什么底层是数组的会有两个?因为他们其在功能上大体没有区别。但ArrayList是线程不安全的,而vector是线程的安全的,当然了,在Java中,线程安全就代表着程序的完整度高一些,运行速度慢一些,所以基于数组的list集合我们一般采用ArrayList集合。而在Set中,我们又有基于Hash算法的HashSet和基于二叉树算法的TreeSet。在Map集合中,我们一般常用到的就是HashMap集合。今天,我们重点介绍Collection集合。
在集合框架中,我们要如何遍历Collection中的每一个元素?不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。典型的用法如下:
Iterator it=collection.iterator();//获得一个迭代元素
while(it.hasNext()) {
Object obj=it.next();//得到下一个元素
}
下面,笔者将就以上幾个集合作为分类为大家简略地介绍一下集合。
List接口:
List是有序的,允许重复的Colllection集合的子接口,除了具有Collection接口必备的iterator()方法外,List接口还可以使用Collections类中对集合操作的一些方法,如add(int index,Element)将指定的元素插入此列表中的指定位置。
remove(int index)移除此列表中指定位置上的元素等方法。
实现List接口的常用类有LinkedList、ArrayList。
LinkedList类:
LinkedList类实现了List接口,允许集合中存在null。此外,LinkedList还具有独特的get()、set()等方法,这些独特的操作方法使LinkedList可被用作或看作一个环状的链表,我们一般将其称为双向循环链表。
但值得我们注意LinkedList的是,其没有同步方法,如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List并且将其上锁,保证数据的安全性:
List list=Collections.synchronizedList(new LinkedList(...));
ArrayList类:
ArrayList的底层由数组完成,因此它具有数组的一些特性,即增删慢、查询快。每个ArrayList实例都有一个容量,即用于存储元素的数组大小。这个容量可随着不断添加新元素而增加,而在这方面,数组就没有集合具有优势,数组的扩容需要代码完成,集合是随着数据的插入而自动扩容,随着数据的消失而自动消失。
Set接口:
与List不同的是,在Set中的对象元素不能重复,也就是说,你不能把同样的东西两次放入同一个Set容器中。它的常用具体实现有HashSet和TreeSet类。HashSet能快速定位一个元素,但是你放到HashSet中的对象需要实现hashCode()方法,它使用了数据库中的哈希算法。而TreeSet则将放入其中的元素按序存放,这就要求你放入其中的对象是可排序的,这就用到了集合框架提供的另外两个实用类Comparable和Comparator。一个类是可排序的,当实现Comparable接口时要重写接口中的Compareto方法,要么实现Comparator接口,如果多个类具有相同的排序算法,那就不需要在每分别重复定义相同的排序算法,只要实现Comparator接口即可。集合框架中还有两个很实用的公用类:Collections和Arrays。Collections提供了对一个Collection容器进行诸如排序、复制、查找和填充等一些非常有用的方法,以供Set集合的使用。
参考文献:
[1] Stuart Reges(美),Marty Stepp . Java程序设计教程大学[D].陈志,译.机械工业出版社,2009.
[2] Y.Daniel Liang(美) . Java语言程序设计[M].机械工业出版社,2008.
[3] Cay S(美) . Horstmann Gary Cornell . Java核心技术[M].人民邮电出版社,2013.