先从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