文章目录
找工作终于告一段落,可以开始经营自己的博客了。磨刀不误砍柴工,要想写出一手好代码,不仅要知其然还要知其所以然,所以熟悉源码是相当有必要的。Java开发中,从基础的JDK库到常用的流行框架如Spring、Hibernate等都是开源的。对于Java程序猿来讲,阅读这些源码,学习大师级的设计哲学的同时,提高自身的coding能力,不得不说是一件益事。
说到阅读源码,还得从最基础的JDK读起。读JDK的源码,当然得从笔试面试中常考的集合框架说起了。
综述
源码路径: java.util.*;
基本的容器主要由Collection、Map两个层次结构组成,其类图关系分别如下所示(图中列出大部分常用的类和接口)。
Collection
-
Collection
一个独立的元素序列,按服从不同的规则分为Set、Queue、List三种类型。下面列举了Collection接口的定义。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18public interface <E> extends Iterable<E> {
int size();
boolean isEmpty();
boolean contains(Object o);
Iterator<E> iterator();
Object[] toArray();
<T> T[] toArray(T[] a);
boolean add(E e);
boolean remove(Object o);
boolean containsAll(Collection<?> c);
boolean addAll(Collection<? extends E> c);
boolean removeAll(Collection<?> c);
boolean retainAll(Collection<?> c);
void clear();
boolean equals(Object o);
int hashCode();
} -
AbstractCollection
上面的Collection类图中省略了AbstractCollection的结构图,AbstractCollection实现了Collection接口,它是AbstractSet、AbstractQueue、AbstractList的公共父类。AbstractCollection重写了toString方法,其子类都会以”[xx, xx, …]”形式输出。 - Set
不保存重复元素。具有与Collection完全一样的接口。HashSet基于散列函数实现,TreeSet基于红黑树实现。 - Queue
队列,只允许在容器的一“端”插入,另一端移除。常用的LinkedList底层基于双端队列(Deque)实现。 - List
线性表,以特定的顺序保存元素。在Collection的基础之上添加大量方法,使得可以在List的中间插入和删除元素。主要实现有ArrayList、Vector和LinkedList。其中前两个基于数组实现,后者基于链表实现。
Map
- Map
键值对,主要实现有HashMap、Hashtable和TreeMap。
下面列举了Map接口的定义。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25public interface Map<K,V> {
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);
void putAll(Map<? extends K, ? extends V> m);
void clear();
Set<K> keySet();
Collection<V> values();
Set<Map.Entry<K, V>> entrySet();
boolean equals(Object o);
int hashCode();
interface Entry<K,V> {
K getKey();
V getValue();
V setValue(V value);
boolean equals(Object o);
int hashCode();
}
// 此处省略其他方法`
}
在Map接口中定义了内部接口(类似于内部类)——Entry,在Map的具体实现类中均采用了类似的方法。例如:HashMap维护了其内部类HashMap.Entry的数组;TreeMap维护了其内部类TreeMap.Entry的红黑树。
源码解读基于JDK-8
近期评论