jdk源码解读(一):容器

文章目录

找工作终于告一段落,可以开始经营自己的博客了。磨刀不误砍柴工,要想写出一手好代码,不仅要知其然还要知其所以然,所以熟悉源码是相当有必要的。Java开发中,从基础的JDK库到常用的流行框架如Spring、Hibernate等都是开源的。对于Java程序猿来讲,阅读这些源码,学习大师级的设计哲学的同时,提高自身的coding能力,不得不说是一件益事。
说到阅读源码,还得从最基础的JDK读起。读JDK的源码,当然得从笔试面试中常考的集合框架说起了。

综述

源码路径: java.util.*;
基本的容器主要由Collection、Map两个层次结构组成,其类图关系分别如下所示(图中列出大部分常用的类和接口)。

Collection

Collection结构图

  • Collection
    一个独立的元素序列,按服从不同的规则分为Set、Queue、List三种类型。下面列举了Collection接口的定义。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    public 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结构图

  • 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
    25
    public 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