集合框架
1. 集合框架的介绍
1.1 集合框架
- 框架是一个类库的集合,集合框架就是一个用来表示和操作集合的统一的架构,它包含了实现集合的接口与类
- 集合框架中不同的集合类有各自不同的数据结构,所以在使用中要根据应用的性能要求来选择不同的集合类
- 集合类存放在java.util包中,今后会大量使用集合类和相关接
1.2 主要接口集
Iterable:迭代器接口
- 实现该接口允许对象成为“foreach”语句(增强for循环)的目标,即该集合对象允许迭代。
- 类集接口Collection是Iterable的子接口,所以所有类集对象可以迭代访问,而映射Map不行
- 构造方法:
- Iterator<T> iterator() //返回一个在一组T类型的元素上进行迭代的迭代器
- 方法摘要:
- boolean hasNext() //如果仍有元素可以迭代,则返回 true。
- E next() //返回迭代的下一个元素。
- void remove() //从迭代器指向的collection中移除迭代器返回的最后一个元素(可选操作)。
- 迭代器Iterator实现了Iterator/ListIterator接口的类的对象,可以通过遍历类集,访问操作其中的每个元素
- ListIterator扩展了父接口Iterator,允许双向遍历,并可以修改和删除元素
Collection:类集接口
- Collection 表示一组对象,这些对象也称为 collection 的元素。
- JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如 Set 和 List)实现。
- 此接口通常用来传递 collection,并在需要最大普遍性的地方操作这些 collection。 方法名(Collection c)
- 方法摘要
- int size() //返回此 collection 中的元素数。 - Object[] toArray() 返回包含此 collection 中所有元素的数组。
- Iterator<E> iterator() //返回在此 collection 的元素上进行迭代的迭代器。
- boolean containsAll(Collection c) //如果此 collection 包含指定 collection 中的所有元素,则返回 true。
- boolean add(E e) //确保此 collection 包含指定的元素
- boolean addAll(Collection c) // 将指定 collection 中的所有元素都添加到此 collection 中
- void clear() //移除此 collection 中的所有元素
- boolean remove(Object o) // 从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。
- boolean removeAll(Collection c) // 移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。
- boolean retainAll(Collection c) //仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。
- boolean contains(Object o) //如果此 collection 包含指定的元素,则返回 true。
- boolean isEmpty() //如果此 collection 不包含元素,则返回 true。
- boolean equals(Object o) //比较此 collection 与指定对象是否相等。
- <T> T[] toArray(T[] a) //返回包含此 collection 中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。
- int hashCode() //返回此 collection 的哈希码值。
int hashCode = 1;
Iterator<E> i = list.iterator();
while (i.hasNext()) {
E obj = i.next();
hashCode = 31*hashCode + (obj==null ? 0 : obj.hashCode());
}
List:列表接口
扩展了Collection,特点:有序且可重复的
List容器是有序的collection。此接口的用户可以对List容器中每个元素的插入值进行精确地控制,用户可以根据元素的整数索引(在列表中的值位置)访问元素,并搜索列表中的元素。List容器允许插入重复的值,包括Null
- List 接口提供了 4 种对列表元素进行定位(索引)访问方法。列表(像 Java 数组一样)是基于 0 的
- List 接口提供了特殊的迭代器,称为 ListIterator,除了允许 Iterator 接口提供的正常操作外,该迭代器还允许元素插入和替换,以及双向访问。还提供了一个方法来获取从列表中指定位置开始的列表迭代器。
- List 接口提供了两种搜索指定对象的方法。从性能的观点来看,应该小心使用这些方法。在很多实现中,它们将执行高开销的线性搜索。
- List 接口提供了两种在列表的任意位置高效插入和移除多个元素的方法。
- List从collection扩展的接口方法:
- ListIterator<E> listIterator()// 返回此列表元素的列表迭代器(按适当顺序)。
- ListIterator<E> listIterator(int index) // 返回列表中元素的列表迭代器(按适当顺序),从列表的指定位置开始。指定的索引表示 next 的初始调用所返回的第一个元素。previous 方法的初始调用将返回索引比指定索引少 1 的元素
- Object[] toArray()//返回按适当顺序包含列表中的所有元素的数组(从第一个元素到最后一个元素)。 由于此列表不维护对返回数组的任何引用,因而它将是“安全的”。(换句话说,即使数组支持此列表,此方法也必须分配一个新数组)。因此,调用者可以随意修改返回的数组。
- boolean containsAll(Collection c)//如果列表包含指定 collection 的所有元素,则返回 true。
- boolean addAll(int index,Collection c)将指定 collection 中的所有元素都插入到列表中的指定位置(可选操作)。将当前处于该位置的元素(如果有的话)和所有后续元素向右移动(增加其索引)。
- void add(int index,E element) //在列表的指定位置插入指定元素(可选操作)。将当前处于该位置的元素(如果有的话)和所有后续元素向右移动(在其索引中加 1)。
- E remove(int index) //移除列表中指定位置的元素(可选操作)。将所有的后续元素向左移动(将其索引减 1)。返回从列表中移除的元素。
- E get(int index) //返回列表中指定位置的元素。
- E set(int index,E element) //用指定元素替换列表中指定位置的元素(可选操作)。
- int indexOf(Object o) //返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1
- int lastIndexOf(Object o)// 返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1。
- List<E> subList(int fromIndex,int toIndex)// 返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分视图。(如果 fromIndex 和 toIndex 相等,则返回的列表为空)。
Queue:队列接口
除了基本的 Collection 操作外,队列还提供其他的插入、提取和检查操作。每个方法都存在两种形式:一种抛出异常(操作失败时),另一种返回一个特殊值(null 或 false,具体取决于操作)。插入操作的后一种形式是用于专门为有容量限制的 Queue 实现设计的;在大多数实现中,插入操作不会失败。
抛出异常 | 返回特殊值 |
---|---|
插入 | add(e) |
移除 | remove() |
检查 | element() |
- Queue 实现通常不允许插入 null 元素,尽管某些实现(如 LinkedList)并不禁止插入 null。即使在允许 null 的实现中,也不应该将 null 插入到 Queue 中
- Queue 实现通常未定义 equals 和 hashCode 方法的基于元素的版本,而是从 Object 类继承了基于身份的版本
- 方法摘要:
- boolean add(E e) // 将指定的元素插入队尾(如果立即可行且不会违反容量限制),在成功时返回 true,如果当前没有可用的空间,则抛出 IllegalStateException。
- boolean offer(E e) // 将指定的元素插入此队列(如果立即可行且不会违反容量限制),当使用有容量限制的队列时,此方法通常要优于 add(E)
-E remove() //获取并移除此队列的头。此方法与 poll 唯一的不同在于:此队列为空时将抛出一个异常。
-E pool() //获取并移除此队列的头,如果此队列为空,则返回 null。
-E element() // 获取,但是不移除此队列的头。此方法与 peek 唯一的不同在于:此队列为空时将抛出一个异常。
-E peek() // 获取但不移除此队列的头;如果此队列为空,则返回 null。
Deque:双端队列接口
一个线性 collection,支持在两端插入和移除元素。名称 deque 是“double ended queue(双端队列)”的缩写,通常读为“deck”。大多数 Deque 实现对于它们能够包含的元素数没有固定限制,但此接口既支持有容量限制的双端队列,也支持没有固定大小限制的双端队列。
第一个元素 | (头部) | 最后一个元素 | (尾部) |
---|---|---|---|
抛出异常 | 特殊值 | 抛出异常 | |
插入 | addFirst(e) | offerFirst(e) | addLast(e) |
移除 | removeFirst() | pollFirst() | removeLast() |
检查 | getFirst() | peekFirst() | getLast() |
- 此接口扩展了 Queue 接口。在将双端队列用作队列时,将得到 FIFO(先进先出)行为。将元素添加到双端队列的末尾,从双端队列的开头移除元素。从 Queue 接口继承的方法完全等效于 Deque 方法,如下表所示:
Queue方法 | 等效Deque方法 |
---|---|
add(e) | addLast(e) |
offer(e) | offerLast(e) |
remove() | removeFirst() |
poll() | pollFirst() |
element() | getFirst() |
peek() | peekFirst() |
- 其余六种方法可以实现栈操作,完全等效于Stack类的方法,在实现堆栈的数据结构中,应优先使用Deque接口而不是Stack类
Stack方法 | 等效Deque方法 |
---|---|
push(e) | addFirst(e) |
pop() | removeFirst() |
peek() | peekFirst() |
- 虽然 Deque 实现没有严格要求禁止插入 null 元素,但建议最好这样做。
- Deque 实现通常不定义基于元素的 equals 和 hashCode 方法,而是从 Object 类继承基于身份的 equals 和 hashCode 方法。
- 迭代器方法:
- Iterator iterator() //返回以正序在此双端队列的元素上进行迭代的迭代器。
- Iterator descendingIterator //返回以逆向顺序在此双端队列的元素上进行迭代的迭代器。
- 其他方法:
- boolean removeFirstOccurrence(Object o) //从队列移除第一次出现的指定元素
- boolean removeLaseOccurrence(Object 0) //从队列移除最后一次出现的指定元素
- 在处理队列操作时,尽量用offer(),poll(),peak()方法而不是,add(),remove(),element()。
在后续做条件判断时,null是一个很好的边界值。
Map接口:
- Map不是Collection的子接口,所以不能使用迭代器来进行遍历
- Map接口映射唯一键到值;
- 键是以后用于检索值的对象,给定一个键和一个值,可以存储这个值到Map对象中,以后通过键来检索;
- 定义的方法:
– int size() //返回容器内映射对的个数
– boolean isEmpty() //容器是否为空
– boolean containsKey(Object Key) //判断容器是否包含指定的键
– boolean containsValue(Object value) //判断容器是否包含指定的值
– V get(Object key) //根据键获取对应的值
– V put(K Key, V value) //添加键/值对到容器内
– V remove(Object key) //删除Map容器中给定的键
– Collection<V> values() //获取Map容器中所有的值
– Set<Map.Entry<K,V>> entrySet() //返回包含映射关系的Set视图