Java集合
早在 Java 2 中之前,Java 就提供了特设类。比如:Dictionary, Vector, Stack, 和 Properties 这些类用来存储和操作对象组。
虽然这些类都非常有用,但是它们缺少一个核心的,统一的主题。由于这个原因,使用 Vector 类的方式和使用 Properties 类的方式有着很大不同。
集合框架被设计成要满足以下几个目标。
- 该框架必须是高性能的。基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的。
- 该框架允许不同类型的集合,以类似的方式工作,具有高度的互操作性。
- 对一个集合的扩展和适应必须是简单的。
为此,整个集合框架就围绕一组标准接口而设计。你可以直接使用这些接口的标准实现,诸如: LinkedList, HashSet, 和 TreeSet 等,除此之外你也可以通过这些接口实现自己的集合。
从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。Collection 接口又有 3 种子类型,List、Set 和 Queue,再下面是一些抽象类,最后是具体实现类,常用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等。
Collection接口
Collection 层次结构中的根接口。Collection 表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如
Set
和List
)实现。此接口通常用来传递 collection,并在需要最大普遍性的地方操作这些 collection。
方法摘要
返回类型 | 方法 |
---|---|
boolean |
add(E e) 确保此 collection 包含指定的元素(可选操作)。 |
boolean |
addAll(Collection<? extends E> c) 将指定 collection 中的所有元素都添加到此 collection 中(可选操作)。 |
void |
clear() 移除此 collection 中的所有元素(可选操作)。 |
boolean |
contains(Object o) 如果此 collection 包含指定的元素,则返回 true 。 |
boolean |
containsAll(Collection<?> c) 如果此 collection 包含指定 collection 中的所有元素,则返回 true 。 |
boolean |
equals(Object o) 比较此 collection 与指定对象是否相等。 |
int |
hashCode() 返回此 collection 的哈希码值。 |
boolean |
isEmpty() 如果此 collection 不包含元素,则返回 true 。 |
Iterator<E> |
iterator() 返回在此 collection 的元素上进行迭代的迭代器。 |
boolean |
remove(Object o) 从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。 |
boolean |
removeAll(Collection<?> c) 移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。 |
boolean |
retainAll(Collection<?> c) 仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。 |
int |
size() 返回此 collection 中的元素数。 |
Object[] |
toArray() 返回包含此 collection 中所有元素的数组。 |
<T> T[] |
toArray(T[] a) 返回包含此 collection 中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。 |
List接口
List接口通常表示一个列表(数组、队列、链表、栈等),是一个有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
与 set 不同,列表通常允许重复的元素。更确切地讲,列表通常允许满足
e1.equals(e2)
的元素对e1
和e2
,并且如果列表本身允许 null 元素的话,通常它们允许多个 null 元素。难免有人希望通过在用户尝试插入重复元素时抛出运行时异常的方法来禁止重复的列表,但我们希望这种用法越少越好。
List
接口提供了特殊的迭代器,称为ListIterator
,除了允许Iterator
接口提供的正常操作外,该迭代器还允许元素插入和替换,以及双向访问。还提供了一个方法来获取从列表中指定位置开始的列表迭代器。Set接口
一个不包含重复元素的 collection。更确切地讲,set 不包含满足
e1.equals(e2)
的元素对e1
和e2
,并且最多包含一个 null 元素。正如其名称所暗示的,此接口模仿了数学上的 set 抽象。
Map接口
Map是一个映射接口,其中的每个元素都是一个key-value键值对,同样抽象类AbstractMap通过适配器模式实现了Map接口中的大部分函数,TreeMap、HashMap、WeakHashMap等实现类都通过继承AbstractMap来实现,另外,不常用的HashTable直接实现了Map接口,它和Vector都是JDK1.0就引入的集合类。
Iterator接口
Iterator是遍历集合的迭代器(不能遍历Map,只用来遍历Collection),除了Map系列的集合,Collection集合都实现了 Iterator 接口,这是一个用于遍历集合中元素的接口,主要有hashNext()、next()、remove()三种方法。它的一个子接口ListIterator在它的基础上又添加了三种方法,分别是 add()、previous()、hasPrevious()方法。也就是说如果实现Iterator接口,那么在遍历集合中元素的时候,只能往后遍历,被遍历后的元素不会再被遍历到,通常无序集合实现的都是这个接口,比如HashSet;而那些元素有序的集合,实现的一般都是ListIterator接口,实现这个接口的集合可以双向遍历,既可以通过next()访问下一个元素,又可以通过previous()访问前一个 元素,比如ArrayList。
Collection的实现类都实现了iterator()函数,它返回一个Iterator对象,用来遍历集合,ListIterator则专门用来遍历List。而Enumeration则是JDK1.0时引入的,作用与Iterator相同,但它的功能比Iterator要少,它只能再Hashtable、Vector和Stack中使用。
**Arrays和Collections **
Arrays和Collections是用来操作数组、集合的两个工具类,例如在ArrayList和Vector中大量调用了Arrays.Copyof()方法,而Collections中有很多静态方法可以返回各集合类的synchronized版本,即线程安全的版本,当然了,如果要用线程安全的结合类,首选Concurrent并发包下的对应的集合类。
Java集合实现类
Java提供了一套实现了Collection接口的标准集合类。其中一些是具体类,这些类可以直接拿来使用,而另外一些是抽象类,提供了接口的部分实现。
- ArrayList
- LinkedList
- Vector
- Stack
- HashSet
- TreeSet
- LinkedHashSet
- ArrayBlockingQueue
- LinkedBlockingQueue
- DelayQueue
- HashMap
- TreeMap
- Hashtable
- LinkedHashMap
- WeakHashMap
- IdentityHashMap
接下来介绍的几个类不是结合实现类,但对集合操作比较重要
- Arrays
- Collections
参考文章