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{
}
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