Java 常用 Collection 继承关系与接口实现
Java Collection
List 接口
继承、接口实现关系:
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<>();
Map 接口
继承、接口实现关系:
public interface Map<K,V>
实现:
Map<Integer, Integer> hashMap = new HashMap<>();
(最常用)
SortedMap 接口
继承、接口实现关系:
public interface SortedMap<K,V> extends Map<K,V>
实现:
-
Map<Integer, Integer> treeMap = new TreeMap<>();
必须实现
Comparable
接口
Set 接口
继承、接口实现关系:
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<>();
(最常用)
SortedSet 接口
继承、接口实现关系:
public interface SortedSet<E> extends Set<E>
实现:
-
Set<Integer> treeSet = new TreeSet<>();
必须实现
Comparable
接口
Queue 接口
继承、接口实现关系:
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
接口
Deque 接口
继承、接口实现关系:
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
。但是我们在使用的时候,总是用特定的接口来引用它,这是因为持有接口说明代码的抽象层次更高,而且接口本身定义的方法代表了特定的用途。
Stack 接口
继承、接口实现关系:
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
中关于各集合的源码