java集合框架的基本接口/类层次结构
java.util.Collection [I]
+--java.util.List [I]
+--java.util.ArrayList [C]
+--java.util.LinkedList [C]
+--java.util.Vector [C]
+--java.util.Stack [C]
+--java.util.Set [I]
+--java.util.HashSet [C]
+--java.util.SortedSet [I]
+--java.util.TreeSet [C]
java.util.Map [I]
+--java.util.SortedMap [I]
+--java.util.TreeMap [C]
+--java.util.Hashtable [C]
+--java.util.HashMap [C]
+--java.util.LinkedHashMap [C]
+--java.util.WeakHashMap [C]
[I]:接口
[C]:类
那么,为什么要有集合类?
面向对象的语言对事物的体现都是以对象的形式,为了方便对多个对象操作,就要对对象进行存储,集合类就是对多个对象进行存储的一种方式。
数组和集合类有何不同?
最主要的区别是长度可变不可变问题。数组可以存储对象,但是长度是固定的,不可变的。集合长度是可变的。其次,数组中可以存储基本数据类型,集合只能存储对象。集合的一个比较大的优点是可以存储不同类型的对象。数组不可以。
下面就开始各种总结。
Collection接口
Collection接口是最基本的集合接口,代表一组Object集合,这些Object被称作Collection的元素,所有实现Collection接口的类型必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素后一个构造函数允许用户复制一个Collection。这些都比较容易理解。
1 Collection<Integer> ci = new ArrayList<Integer>();
2 Collection<Integer> ci2 = new ArrayList<Integer>(Arrays.asList(1,2,3,4,5));
并且注意Collection中没有get()方法,要想查看或者操作Collection中的元素只能遍历,使用的是iterator()方法,使用该方法可以逐一访问Collection的每一个元素。
1 Iterator it = collection.iterator();//获得迭代
2 while(it.hasNext()){
3 Object obj = it.next();//得到下一个元素
4 }
由上图可知,Collection分为Lst接口和Set接口。
List接口
List接口是有序的Collection,使用该接口能精确控制每个元素的插入位置,可以使用索引来访问List中的元素,跟数组是很类似的。并且List中允许有重复元素,当然有些List的实现类不允许重复元素的存在。
List中有iterator()方法,还有listIterator方法,返回一个ListIterator接口,这个接口比标准的Iterator接口相比,多了一些add之类的方法,允许添加、删除、设置元素值以及向前或者向后遍历等。
如上图,List下有几个常用类:LinkedList、ArrayList和Vector以及Stack。
(1)ArrayList类:实现了可变大小的数组。它允许包含所有元素,包括null。每个ArrayList实例都有一个容量,即用于存储元素的数组的大小,这个容量可以随着不断添加新元素而自动增加,但增长算法没有定义,当插入大量元素时,插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。
(2)LinkedList类:允许null元素,提供额外的get,remove和insert方法,这使得LinkedList可以用作stack、queue或双向队列。它可以再List的中间插入和移除,在这方面比ArrayList有效,但是在随机访问方面就没有ArrayList有效了。如果多个线程同时访问一个List,则必须自己实现访问同步,一种解决方法是在创建List时构造一个同步的List:
List list = Collection.synchronizedList(new LinkedList(……));
(3)Vector类:Vector跟ArrayList非常类似,但是Vector是同步的,由Vector创建的Iterator,虽然和ArrayList创建的 Iterator是同一接口,但是,因为Vector是同步的,当一个Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例如,添加或删除了一些元素),这时调用Iterator的方法时将抛出ConcurrentModificationException,因此必须捕获该异常。
(4)Stack类:继承自Vector,实现一个后进先出的栈。提供了几个基本方法,push、pop、peak、empty、search等。
总结:
- List:元素是有序的,元素可以重复。因为该集合体系有索引。
-
- ArrayList:底层的数据结构使用的是数据结构。
-
- 查询速度很快。
- 增删稍慢。
- 线程不同步。
- 默认长度为10增长率为50%。
- LinkedList:底层使用的链表数据结构。
-
- 增删速度很快。
- 查询稍慢。
- Vector:底层是数组数据结构。1.0出现
-
- 线程同步
- 被ArrayList替代了。
- 长度增长率100%。
Set接口
Set接口是继承自Collection的,它不能包含有重复元素。Set中最多有一个null元素。