Collection -- List--LinkedList
--ArrayList
--Vector
-- Set
Map -- HashMap
-- HashTable
-- WeakHashMap
Collection接口:
Collection是最基本的集合类接口,一个collection代表一组object。jdk提供的类都是继承自Collection的子接口如 List,Set。所有实现Collection接口的类都必须提供两个标准的构造函数:一个无参,一个有参。实现类都支持一个 Iterator()方法,进行迭代可访问Collection中的每一个元素:
Iterator it = collection.iterator()
while(it.hasNext()){
Object obj = it.next();
}
List接口:
list是有序的Collection,使用此接口可以保证插入的位置。用户可以使用索引来查找元素,类似于数组。除了 Collection的iterator(),List接口还提供一个listIterator()方法,返回一个ListIterator接口,和标准Iterator
接口相比,允许添加,删除,设定元素,向前后遍历。List接口的常用类:ArrayLsit,LinkedList,Vector,Stack。
ArrayLsit
实现了可变大小的数组,它允许所有的元素,包括null。ArrayList不是同步的。 手动实现同步:
List list = Collections.synchronizedList(new ArrayList(...));
LinkedList
允许null元素,另外提供了get,remove,insert方法再LinkedList首部或尾部。这些操作可以使LinkedList堆 栈(stack),队列(queue)或双向队列(deque)。没有事相同步,多线程访问LinkedList时候需要自己实现同步:
List list = Collections.synchronizedList(new LinkedList(...));
Vector
类似于ArrayList,实现了先进后出的堆栈。实现了同步。当一个Iterator被创建且正在使用,另一个线程改变 了 Vector的状态(添加或删除元素),调用Iterator的方法时将抛出ConcurrentModificationException,因此必须捕 获该异常。
Stack
Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基 本的push和pop 方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈 中的位置。Stack刚创建后是空栈。
Set接口:
Set接口不包含重复元素,并且是无需的。
Map接口:
没有继承Collection接口,提供Key-Value的映射,不能包含相同的key。key与value是一对一的关系 。
HashTable:
实现了一个KEY-VALUE映射的哈希表,是同步的。不允许有空值null。通过initial capacity和load factor两个参数调整性能。通常缺省的load factor 0.75较好地实现了时间和空间的均衡。增大load factor可以节省空间但相应的查找时间将增大,这会影响像get和put这样的操作由于作为key的对象将通过计算其散列函数来确定与之对应的value的位置,因此任何作为key的对象都必须实现hashCode和equals方法。
HashMap类:
与HashTable类似,不同之处在于非同步的。并且允许null值,null-key,null-value。
WeakHashMap类:
WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,一个key不再被外部所引用,那么该key可以被GC回收。
总结:
List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。
多个线程操作时注意使用同步的类,或者将不同步的类转化为同步的类。
要特别注意对哈希表的操作,作为key的对象要正确复写equals和hashCode方法。
尽量返回接口而非实际的类型,如返回List而非ArrayList,LinkedList等。
同步性:
Vector是同步的,ArrayList是异步的,效率上来讲不考虑同步的话使用ArryList。内部实现机制都是使用的数组。缺省vector每次增长100%,ArrayList为50%。保存大量数据的话vector会有优势。也可以设置初始大小避免资源不必要的开销。
LinkedList基于链表实现。插入或者操作有优势。不过也要看实际情况,针对单条数据是,linkedList不如ArrayList快。
HashMap与HashTable
一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现
二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的
三.值:只有HashMap可以让你将空值作为一个表的条目的key或value