集合简介
java中数组是很常用的一种的数据结构,我们用它可以满足很多的功能,但是,有时我们会遇到如下这样的问题:
(1)我们需要该容器的长度是不确定的。
(2)我们需要它能自动排序。
(3)我们需要存储以键值对方式存在的数据。
如果遇到上述的情况,数组是很难满足需求的,因此java给我们提供了另一种与数组类似的数据结构——集合类,集合类也称容器类,常用来保存临时数据,管理对象等,集合在Java语言中也是非常重要的一类知识,今天我们来探讨一下集合类的使用。先来看看集合类UML图:
一、Collection
public interface Collection<E> extends Iterable<E> {
Collection是最基本的集合接口,定义了集合常用操作抽象方法(如add、remove等),list与set接口实现了Collection接口,从Collection接口的定义可以看出,它实现了Iterable接口,因此Collection可以采用iterator迭代来进行遍历。
for (Iterator iterator = c.iterator(); iterator.hasNext();) {
Object object = (Object) iterator.next();
}
二、List
List实现了Collection接口,其存储的元素是有序的,存储的元素可以重复,List可以包含null,即使使用了泛型。
List常用集合包括:
(1)ArrayList
基于数组存储,读取速度快,插入与删除速度慢(因为插入与删除时要移动后面的元素),适合于随机访问。
(2)vector
基于数组存储,功能与ArrayList几乎相同,设置都是基于线程同步的。
public synchronized boolean add(E e) {
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = e;
return true;
}
方法都加上了synchronized前缀。
(3)LinkedList
基于链表存储,删除与插入速度快,读取速度较慢,因为它读取时是从头向尾(如果节点在链的前半部分),或尾向头(如果节点在链的后半部分)查找元素。因此适合于元素的插入与删除操作。
此外LinkedList提供额外的get,remove,insert方法在 LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队(deque)。
LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。一种是在方法中实现同步,另外一种解决方法是在创建List时构造一个同步的List:
List list=Collections.synchronizedList(new ArrayList());
三、Set
Set也实现了Collection接口,其存储的元素是无序的,存储的元素不可以重复。
Set大致分为2类:
(1)不排序Set:(a)HashSet 可以包含null,查询速度最快
(b)LinkedHashSet
可以包含null,继承了HashSet,保持元素的插入次序,因为内部使用LinkedHashMap实现,所以能保持元素插入次序。
(2)不排序Set
(a)TreeSet,内部以 TreeMap来实现
四、Map
Map中存储的是“键值对”
Map分为2种:
(1)排序Map
TreeMap,非线程安全
(2)不排序Map
(a)HashMap, 采取Hash表的方式进行存储,HashMap不是线程安全的,可以存储null的,无论是对Key还是对Value
(b)Hashtable,采取Hash表的方式进行存储,Hashtable是线程安全的,Hashtable是不可以存储null的
(c)LinkedHashMap