容器类可以大大提高编程效率和编程能力,在Java2中,所有之容器都由SUN公司之JoshuaBloch进行了重新设计,丰富了容器类库之功能。
Java2容器类类库之用途是“保存对象”,它分为两类:
Collection----一组独立之元素,通常这些元素都服从某种规则。List必须保持元素特定之顺序,而Set不能有重复元素。
Map----一组成对之“键值对”对象,即其元素是成对之对象,最典型之应用就是数据字典,并且还有其它广泛之应用。另外,Map可以返回其所有键组成之Set和其所有值组成之Collection,或其键值对组成之Set,并且还可以像数组一样扩展多维Map,只要让Map中键值对之每个“值”是一个Map即可。
1.迭代器
迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中之对象,而开发人员不需要了解该序列之底层结构。迭代器通常被称为“轻量级”对象,因为创建它之代价小。
Java中之Iterator功能比较简单,并且只能单向移动:
(1)使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator之next()方法时,它返回序列之第一个元素。
(2)使用next()获得序列中之下一个元素。
(3)使用hasNext()检查序列中是否还有元素。
(4)使用remove()将迭代器新返回之元素删除。
Iterator是Java迭代器最简单之实现,为List设计之ListIterator具有更多之功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。
2.List之功能方法
List(interface):次序是List最重要之特点;它确保维护元素特定之顺序。List为Collection添加了许多方法,使得能够向List中间插入与移除元素(只推荐LinkedList使用)。一个List可以生成ListIterator,使用它可以从两个方向遍历List,也可以从List中间插入和删除元素。
ArrayList:由数组实现之List。它允许对元素进行快速随机访问,但是向List中间插入与移除元素之速度很慢。ListIterator只应该用来由后向前遍历ArrayList,而不是用来插入和删除元素,因为这比LinkedList开销要大很多。
LinkedList:对顺序访问进行了优化,向List中间插入与删除得开销不大,随机访问则相对较慢(可用ArrayList代替)。它具有方法addFirst()、addLast()、getFirst()、getLast()、removeFirst()、removeLast(),这些方法(没有在任何接口或基类中定义过)使得LinkedList可以当作堆栈、队列和双向队列使用。
3.Set之功能方法
Set(interface):存入Set之每个元素必须是唯一之,因为Set不保存重复元素。加入Set之Object必须定义equals()方法以确保对象之唯一性。Set与Collection有完全一样之接口。Set接口不保证维护元素之次序。
HashSet:为快速查找而设计之Set。存入HashSet之对象必须定义hashCode()。
TreeSet:保持次序之Set,底层为树结构。使用它可以从Set中提取有序之序列。
LinkedHashSet:具有HashSet之查询速度,且内部使用链表维护元素之顺序(插入之次序)。于是在使用迭代器遍历Set时,结果会按元素插入之次序显示。
HashSet采用散列函数对元素进行排序,这是专门为快速查询而设计之;TreeSet采用红黑树之数据结构进行排序元素;LinkedHashSet内部使用散列以加快查询速度,同时使用链表维护元素之次序,使得看起来元素是以插入之顺序保存之。需要注意之是,生成自己之类时,Set需要维护元素之存储顺序,因此要实现Comparable接口并定义compareTo()方法。