继承、接口实现关系:
public interface List<E> extends Collection<E>
方法定义:
boolean add(E e)boolean add(int index, E e)E remove(int index)boolean remove(Object e)E get(int index)int size()实现:
List<Integer> arrayList = new ArrayList<>();List<Integer> linkedList = new LinkedList<>();继承、接口实现关系:
public interface Map<K,V>
实现:
Map<Integer, Integer> hashMap = new HashMap<>();(最常用)继承、接口实现关系:
public interface SortedMap<K,V> extends Map<K,V>
实现:
Map<Integer, Integer> treeMap = new TreeMap<>();
必须实现 Comparable 接口
继承、接口实现关系:
public interface Set<E> extends Collection<E>
方法定义:
Set<E>:boolean add(E e)Set<E>删除:boolean remove(Object e)boolean contains(Object e)实现:
Set<Integer> hashSet = new HashSet<>();(最常用)继承、接口实现关系:
public interface SortedSet<E> extends Set<E>
实现:
Set<Integer> treeSet = new TreeSet<>();
必须实现 Comparable 接口
继承、接口实现关系:
public interface Queue<E> extends Collection<E>
方法定义:
获取队列长度:int size()
| throw Exception | 返回false或null | |
|---|---|---|
| 添加元素到队尾 | add(E e) | boolean offer(E e) | 
| 取队首元素并删除 | E remove() | E poll() | 
| 取队首元素但不删除 | E element() | E peek() | 
实现:
Queue<Integer> queue = new LinkedList<>();( LinkedList<E> 实现了 Deque<E> 接口,Deque<E> 接口继承于 Queue<E> 接口)
Queue<Integer> priorityQueue = new PriorityQueue<>();
必须实现 Comparable 接口
继承、接口实现关系:
public interface Deque<E> extends Queue<E>
方法定义与对比:
| Queue | Deque | |
|---|---|---|
| 添加元素到队尾 | add(E e)/offer(E e) | addLast(E e)/offerLast(E e) | 
| 取队首元素并删除 | E remove()/E poll() | E removeFirst()/E pollFirst() | 
| 取队首元素但不删除 | E element()/E peek() | E getFirst()/E peekFirst() | 
| 添加元素到队首 | 无 | addFirst(E e)/offerFirst(E e) | 
| 取队尾元素并删除 | 无 | E removeLast()/E pollLast() | 
| 取队尾元素但不删除 | 无 | E getLast()/E peekLast() | 
实现:
Deque<Integer> deque = new LinkedList<>();Deque<Integer> arrayDeque = new ArrayDeque<>();建议:
Queue 提供的 add()/offer() 方法在 Deque 中也可以使用,但是,使用 Deque,最好不要调用 offer(),而是调用 offerLast()。
如果直接写 deque.offer(),我们就需要思考,offer() 实际上是 offerLast(),我们明确地写上 offerLast(),不需要思考就能一眼看出这是添加到队尾。
因此,使用 Deque,推荐总是明确调用 offerLast()/offerFirst() 或者 pollFirst()/pollLast() 方法。
面向抽象编程的一个原则:尽量持有接口,而不是具体的实现类。
我们发现 LinkedList 真是一个全能选手,它即是 List,又是 Queue,还是 Deque。但是我们在使用的时候,总是用特定的接口来引用它,这是因为持有接口说明代码的抽象层次更高,而且接口本身定义的方法代表了特定的用途。
继承、接口实现关系:
public class Stack<E> extends Vector<E>
public class Vector<E>     extends AbstractList<E>     implements List<E>, RandomAccess, Cloneable, java.io.Serializable
方法定义:
push(E)pop(E)peek(E)实现:
通常使用 Deque 作为 Stack 使用。注意只调用 push()/pop()/peek() 方法,不要调用 addFirst()/removeFirst()/peekFirst() 方法,这样代码更加清晰。
参考:
java.util 中关于各集合的源码原文:https://www.cnblogs.com/varc/p/14992316.html