PS:先谢谢天涯海角和枫飘天涯两位朋友,让我有勇气继续下去
提供上一节的链接
java.util包的学习笔记一
7.集合Collection框架
一直都不敢对这个系列的类入手,首先感觉太复杂了,但是我最终还是说服了自己咬咬牙,还是来看看,先在网上搜了一下关于这个方面的
文章感觉是这个方面的知识跟一些数学知识联系起来看还是可以找到头绪的。
首先就是集合的概念包括一些集合的运算,象交,并,包含的关系,映射也是属于集合但是java里的映射Map接口并不是继承自Collection。
好了,首先我们来看看
Collection接口:
Collection接口用于表示任何对象或元素组。想要尽可能以常规方式处理一组元素时,就使用这一接口。
该接口支持如添加和除去等基本操作。设法除去一个元素时,如果这个元素存在,除去的仅仅是集合中此元素的一个实例。
boolean add(Object element)
boolean remove(Object element)
Collection接口还支持查询操作:
int size()
boolean isEmpty()
boolean contains(Object element)
Iterator iterator()
Collection接口支持的其它操作,要么是作用于元素组的任务,要么是同时作用于整个集合的任务。
boolean containsAll(Collection collection)
boolean addAll(Collection collection)
void clear()
void removeAll(Collection collection)
void retainAll(Collection collection)
containsAll()方法允许您查找当前集合是否包含了另一个集合的所有元素,即另一个集合是否是当前集合的
子集。其余方法是可选的,因为特定的集合可能不支持集合更改。addAll()方法确保另一个集合中的所有
元素都被添加到当前的集合中,通常称为并。clear()方法从当前集合中除去所有元素。removeAll()方法类似于
clear(),但只除去了元素的一个子集。retainAll()方法类似于removeAll()方法,不过可能感到它所做的与前
面正好相反:它从当前集合中除去不属于指定集合的元素,即交。
List接口:
继承Collection以实现一个允许有重复项的有序集合,添加了索引项,和ListIterator迭代器(可以双向迭代)
另外函数subList(int from, int end)遵循前包后不包的原则(也就是返回的List只包含下标为
第from,from+1,...end-1个元数),
实现类:
ArrayList,LinkedList,区别在于前者是基于数组来实现的,后者是基于链表来实现(里面有个内部元素类
Entry)导致前面的随即访问较后者要快,但是插入、移除操作不及后面的快,另后者操作方法也更灵活,
包括前者没有的add,get,remove-([First][Last]),这些方法可以作为堆栈,队列,双向队列使用。
Vector,可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。但是,
Vector 的大小可以根据需要增大或缩小,以适应创建 Vector 后进行添加或移除项的操作。 并发编程不安全
这里讲一下1.5版本和以前的版本不同的地方。
往一个ArrayList中加入一个整数,1.5版本以前的版本写法是:
List list = new ArrayList();
list.add( new Integer( 10 ) );
而在1.5版本中可以写为:
list.add( 10 );
因为,在1.5版本中,对一个整数进行包装,使之成为一个Integer对象(即包装,boxing),然后加入到一个
ArrayList中的做法被认为是没有必要的,反之,解包(unboxing)的做法也是没有必要的,这样的代码只是增
加了程序的文本长度而已,所以1.5版本支持了自动包装和解包操作,对于bool/Boolean,byte/Byte,
double/Double,short/Short,int/Integer,long/Long,float/Float的相应包装/解包操作都进行了支持,
从而使代码变得简单。
Set接口:(共15个函数)
继承Collection,不允许重复的项,没有添加任何新的方法,只是在添加的函数中依赖元素equals()方法检
查等同性。
实现类:
HashSet:为快速查找而设计的Set,存入的对象必须实现hashCode();
TreeSet:保持次序的Set ,底层为树结构,使用它可以从Set中提取有序的序列,
LinkedHashSet:具有HashSet的查询速度,且内部使用链表维护元素的顺序。
Map接口:
首先说明的是与Collection没有任何关系,反映的是一对映射关系的集合,该接口描述了从不重复的键到值
的映射。我们可以把这个接口方法分成三组操作:改变、查询和提供可选视图。
改变操作允许您从映射中添加和除去键-值对。键和值都可以为null。但是,您不能把Map作为一个键或值添
加给自身。
Object put(Object key, Object value)
Object remove(Object key)
void putAll(Map mapping)
void clear()
查询操作允许您检查映射内容:
Object get(Object key)
boolean containsKey(Object key)
boolean containsValue(Object value)
int size()
boolean isEmpty()
最后一组方法允许您把键或值的组作为集合来处理。
public Set keySet()
public Collection values()
public Set entrySet()
因为映射中键的集合必须是唯一的,您用Set支持。因为映射中值的集合可能不唯一,您用Collection支持。
最后一个方法返回一个实现Map.Entry接口的元素Set。
实现类:
TreeMap:基于红黑树的实现,查看键或键值对时,他们能会被排序,TreeMap是唯一一个带subMap()的Map,
它可以返回一个子树。
HashMap:是Map基于散列表的实现,插入和查询“键值对”的开销是固定的,可以通过构造起设置容量和负载
因子(load factor),以调整容器性能。
LinkedHashMap:Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序。此实现与 HashMap 的不同
之处在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭
代顺序通常就是将键插入到映射中的顺序(插入顺序)。注意,如果在映射中重新插入键,则插
入顺序不受影响。(如果在调用 m.put(k, v) 前 m.containsKey(k) 返回了 true,则调用时会
将键 k 重新插入到映射 m 中。)
这里要解释一下loadfactor,默认为0.75,负载因子是哈希表在其容量自动增加之前可以达到多满的一种
尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行rehash操作
(即重建内部数据结构),从而哈希表将具有大约两倍的桶数。
通常,默认加载因子 (.75)在时间和空间成本上寻求一种折衷。加载因子过高虽然减少了空间开销,
但同时也增加了查询成本(在大多数 HashMap 类的操作中,包括 get和put操作,都反映了这一点)。
在设置初始容量时应该考虑到映射中所需的条目数及其加载因子,以便最大限度地减少 rehash
操作次数。如果初始容量大于最大条目数除以加载因子,则不会发生 rehash 操作。
Arrays类
此类包含用来操作数组(比如排序和搜索)的各种方法。此类还包含一个允许将数组作为列表来查看的静态工厂。
感觉最重要的一个函数师asList(Object[])函数把一个数组转换成List类型,还有二分搜索法,排序、复制、填
充数组,等。
这些函数全部是静态函数,直接通过 Arrays.** 来调用,他也是用的比较广泛的一个类。
总结java.util包里的东东包括一些集合框架方面的,日历,时间方面,及正则表达式,模式匹配等方面的类
[此贴子已经被作者于2007-9-16 15:12:01编辑过]