1. 程式人生 > >Java原始碼分析---(Java.util包分析之Collection)

Java原始碼分析---(Java.util包分析之Collection)

先從AbstractCollection<E>抽象類開始:

public abstract class AbstractCollection<E> implements Collection<E>{

/*****/

}

public interface Iterable<T> {

}

Collection介面繼承了Iterable<E>迭代器,迭代器就是一個頂級的介面;

public interface Collection<E> extends Iterable<E> {

}

由此可以看出這是個抽象類,他的子類包括:

AbstractList , AbstractQueue , AbstractSet , ArrayDeque

public interface Collection<E> extends Iterable<E>{

/*****/

}

public interface Iterable<T> {

/****/

}

Collection<E> 可以看出這是一個介面,繼承了Iterable<E>迭代器介面;

AbstractList此類提供的骨幹實現的List介面以最小化來實現該介面由一個“隨機訪問”資料儲存備份所需的工作(如陣列)。

public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {

}

public interface List<E> extends Collection<E> {

}

eg:AbstractList實現了介面List,ArrayList繼承了抽象類AbstractList<E>,也就有了父類所有的方法;以下為ArrayList的原始碼擷取片段;

public class ArrayList<E> extends AbstractList<E>{

}

LinkedList與ArrayList 的區別我們可以從下面的程式碼片段看出了;

public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable{

}

它是繼承了AbstractSequentialList<E>,而AbstractSequentialList<E>是繼承AbstractList;並沒有直接繼承AbstractList<E>

AbstractQueue這個類提供了一些Queue操作的骨架實現。

public abstract class AbstractQueue<E> extends AbstractCollection<E>  implements Queue<E> {

}

AbstractSet 此類提供的骨幹實現Set介面最小化以實現此介面所需的工作。

public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E> {

}

ArrayDeque 可調整大小的陣列的實現的Deque介面。 陣列deques沒有容量限制; 他們根據需要增長以支援使用。 它們不是執行緒安全的; 在沒有外部同步的情況下,它們不支援多執行緒的併發訪問。

public class ArrayDeque<E> extends AbstractCollection<E> implements Deque<E>, Cloneable, Serializable{

}

Map介面:

public interface Map<K,V> {

}

裡面有我們常用的方法,比如獲取Map的size;還有Map的 V put(K key, V value)的方法,等等;

如果我們要使用Map集合時,一般就是new一個出來,

eg:Map<String,Object> map=new HashMap<String,Object>();

下面我們看看HashMap的原始碼:

public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable {

}

可知HashMap<K,V> 是繼承Map的抽象類,實現了Map<K,V>的介面,Cloneable介面(可以被克隆),Serializable (可以被序列化);還有一個HashTable的原始碼;

下面我們看看HashTable的原始碼:

public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, java.io.Serializable {

}

共同點在於都是實現了Map的介面,不同的是在繼承的方面上,一個是繼承AbstractMap<K,V>,另一個是繼承Dictionary<K,V>;

以下摘自Java API文件:

Dictionary類是任何類的抽象父類,例如Hashtable ,它將鍵對映到值。 每個鍵和每個值都是一個物件。 在任何一個Dictionary物件中,每個鍵最多與一個值相關聯。 給定一個Dictionary和一個鍵,可以查詢關聯的元素。 任何非null物件都可以用作鍵和值。

通常, equals實現應該使用equals方法來確定兩個鍵是否相同。

* <strong>NOTE: This class is obsolete.  New implementations should
 * implement the Map interface, rather than extending this class.</strong>

注意:此類已過時。 新的實現應該實現Map介面,而不是擴充套件這個類。

public abstract class Dictionary<K,V> {

}

還有執行緒安全的問題;以下摘自HashTable原始碼片段:


也就是說HashTable的安全的;

具體區別:如下連結:

https://blog.csdn.net/fujiakai/article/details/51585767