文章目录
一、迭代器
迭代器(iterator),是确使用户可在容器对象(container,例如链表或数组)上遍访的对象,设计人员使用此接口无需关心容器对象的内存分配的实现细节。其行为很像数据库技术中的光标(cursor),迭代器最早出现在1974年设计的CLU编程语言中。
Java的迭代器(iterator)
- 迭代器(Iterator)模式,又叫做游标模式,它的含义是,提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节。
- Collection的顶层接口
- 可迭代是java集合框架下的所有集合类的共性
- 迭代器就是一个接口Iterator,实现了该接口的类就叫做可迭代类,这些类多数时候指的就是java.util包下的集合类。
public class IteratorDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
// 1、获取list的迭代器对象
Iterator<String> it = list.iterator();
//调用迭代器的hasNext方法,判断是否有下一个元素
while (it.hasNext()) {
//将迭代器的下标移动一位,并得到当前位置的元素值
System.out.println(it.next());
}
// 2、foreach遍历、底层仍旧是iterator
list.forEach(item -> System.out.println(item));
list.forEach(item -> {
if ("b".equals(item)) {
System.out.println(item);
}
});
}
}
二、Collection(单列集合)
- 可选操作:子类可以不实现。
方法 (Method) | 描述 (Description) |
---|---|
int size() | 返回集合元素数(最大值:Integer.MAX_VALUE) |
boolean isEmpty() | 集合不含任何元素,返回true |
boolean contains(Object o) | 当且仅当这个集合包含至少一个元素e返回true(O == NULLé== NULL:o.equals(e)条)。 |
Iterator iterator() | 返回对此集合中的元素进行迭代的迭代器。 |
Object[] toArray(); | 返回一个包含此集合中所有元素的数组。 如果此集合对由其迭代器返回其元素的顺序进行了任何保证,则此方法必须以相同的顺序返回元素。 |
T[] toArray(T[] a) | 返回包含此集合中所有元素的数组; 返回的数组的运行时类型是指定数组的运行时类型 |
boolean add(E e) | 如果此集合由于调用而发生更改,则返回true |
boolean remove(Object o) | 更正式地,将删除元素e(O == NULLé== NULL:o.equals(e))的,如果该集合包含一个或多个这样的元件。 如果此集合包含指定的元素(或者等效地,如果此集合由于调用而更改),则返回true 。 |
boolean containsAll(Collection<?> c) | 如果此集合包含指定集合中的所有元素,则返回true |
boolean addAll(Collection<? extends E> c); | 将指定集合中的所有元素添加到此集合中(可选操作)。 |
boolean removeAll(Collection<?> c); | 删除包含在指定集合中的所有此集合的元素(可选操作) |
boolean retainAll(Collection c) | 把交集的结果存在当前集合中,不影响c |
void clear() | 删除集合内所有元素(可选操作) |
boolean equals(Object o) | 将指定的对象与此集合进行比较以获得相等性 |
int hashCode() | 返回此集合的哈希码值 |
default Spliterator spliterator() | 返回集合的Spliterator |
default void forEach(Consumer<? super E>action) | 对Iterable的每个元素执行给定的操作,直到所有元素都被处理或动作引发异常。 除非实现类另有规定,否则按照迭代的顺序执行操作(如果指定了迭代顺序) |
default Stream Stream() | 返回以此集合作为源的Stream |
1. List接口
- 实现类:ArrayList,LinkedList,Vector
- 传送门
2. Set接口
- 被HashSet类实现,被SortedSet接口继承,同时TreeSet类实现SortedSet接口,LinkedHashSet类继承HashSet类;
- 传送门
3. Queue接口
3.1 源码
public interface Queue<E> extends Collection<E> {
//将指定元素插入到队列的尾部(队列满了话,会抛出异常)
boolean add(E e);
//将指定元素插入此队列的尾部(队列满了话,会返回false)
boolean offer(E e);
//返回取队列头部的元素,并删除该元素(如果队列为空,则抛出异常)
E remove();
//返回队列头部的元素,并删除该元素(如果队列为空,则返回null)
E poll();
//返回队列头部的元素,不删除该元素(如果队列为空,则抛出异常)
E element();
//返回队列头部的元素,不删除该元素(如果队列为空,则返回null)
E peek();
}
3.2 常见实现类
在Java中,ArrayDeque、LinkedList、PriorityQueue等类实现了Queue接口,模拟了队列的数据结构。
- PriorityQueue:Queue的直接子类,线程不安全,不允许插入null元素,用“堆结构”来实现,支持优先级队列实现类。
- ConcurrentLinkedQueue,ArrayBlockingQueue,LinkedBlockingQueue,PriorityBlockingQueue,DelayQueue,SynchronousQueue,LinkedBlockingDeque。
3.3 子接口:Deque接口
Deque支持在两端插入和移除元素。名称 deque 是“double ended queue(双端队列)”的缩写,通常读为“deck”。大多数 Deque 实现对于它们能够包含的元素数没有固定限制,但此接口既支持有容量限制的双端队列,也支持没有固定大小限制的双端队列。
- 此接口定义在双端队列两端访问元素的方法。提供插入、移除和检查元素的方法。每种方法都存在两种形式:一种形式在操作失败时抛出异常,另一种形式返回一个特殊值(null 或 false,具体取决于操作)。插入操作的后一种形式是专为使用有容量限制的 Deque 实现设计的;在大多数实现中,插入操作不能失败。
常用方法
操作 | 队头 | 队尾 |
---|---|---|
插入 | addFirst(e)/offerFirst(e) | addLast(e)/offerLast(e) |
移除 | removeFirst()/pollFirst() | removeLast()/pollLast() |
获取 | getFirst()/peekFirst | getLast()/peekLast() |
和堆栈的联系
堆栈方法 | 等效 Deque 方法 |
---|---|
push(e) | addFirst(e) |
pop() | removeFirst() |
peek() | peekFirst() |
三、Map(双列集合)
将键映射到值的对象。 映射不能包含重复的键; 每个键最多可以映射到一个值。
方法 (Method) | 描述 (Description) |
---|---|
int size() | 返回此映射中的键值映射数 |
boolean isEmpty() | 如果此映射不包含键值映射,返回true |
boolean containsKey(Object key) | 当且仅当此映射包含键k的映射,使得(key == null?k == null:key.equals(k))时,返回true 。 |
boolean containsValue(Object value) | 当且仅当此映射包含至少一个到值v的映射(值== null?v == null:value.equals(v))时,才返回true |
V get(Object key) | 如果此映射包含从键k到值v的映射,使得(keynull ? knull : key.equals(k)) ,则此方法返回v ;否则,此方法返回v 。 否则返回null 。 |
V put(K key, V value) | 将指定值与该映射中的指定键相关联(可选操作)。 |
V remove(Object key) | 如果存在,则从此映射中删除键的映射(可选操作) |
void putAll(Map<? extends K, ? extends V> m) | 将所有映射从指定映射复制到此映射(可选操作)。 |
void clear() | 从此映射中删除所有映射(可选操作) |
Set keySet() | 返回此映射中包含的键的Set视图。返回值: |
此地图中包含的键的设置视图 | |
Collection values() | 返回此映射中包含的值的Collection视图 |
Set<Map.Entry<K, V>> entrySet() | 返回此映射中包含的映射的Set视图。返回值: |
此地图中包含的映射的集合视图 | |
boolean equals(Object o) | 如果m1.entrySet()。equals(m2.entrySet()) ,则两个映射m1和m2表示相同的映射 |
int hashCode() | 返回此映射的哈希码值。 映射的哈希码定义为映射的entrySet()视图中每个条目的哈希码之和 |
default V getOrDefault(Object key, V defaultValue) | 返回指定键所映射到的值;如果此映射不包含键的映射关系,则返回defaultValue |
default void forEach(BiConsumer<? super K, ? super V> action) | 在此映射中为每个条目执行给定的操作,直到所有条目都已处理或该操作引发异常为止 |
default boolean remove(Object key, Object value) | 仅当当前映射到指定值时,才删除指定键的条目 |
default boolean replace(K key, V oldValue, V newValue) | 仅当当前映射到指定值时,才替换指定键的条目 |
- 实现类:HashMap、HashTable,同时Propertise类继承HashTable。
- 子接口:SortedMap,同时TreeMap类实现了SortedMap接口;
- 传送门