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源码片段:

Java源码分析---(Java.util包分析之Collection<E>)

也就是说HashTable的安全的;

具体区别:如下链接:

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