Aotle

你所看到的惊鸿,都曾被平庸磨练

java集合抽象类

抽象类

abstractcollection

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

AbstractCollection是一个抽象类,它实现了Collection中除iterator()和size()之外的函数。
AbstractCollection的主要作用:它实现了Collection接口中的大部分函数。从而方便其它类实现Collection,比如ArrayList、LinkedList等,它们这些类想要实现Collection接口,通过继承AbstractCollection就已经实现了大部分的接口了。

abstractlist

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

AbstractList是一个继承于AbstractCollection,并且实现List接口的抽象类。它实现了List中除size()、get(int location)之外的函数。
AbstractList的主要作用:它实现了List接口中的大部分函数。从而方便其它类继承List。
另外,和AbstractCollection相比,AbstractList抽象类中,实现了iterator()接口。

abstractset

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

AbstractSet是一个继承于AbstractCollection,并且实现Set接口的抽象类。由于Set接口和Collection接口中的API完全一样,Set也就没有自己单独的API。和AbstractCollection一样,它实现了List中除iterator()和size()之外的函数。
AbstractSet的主要作用:它实现了Set接口中的大部分函数。从而方便其它类实现Set接口。

abstractmap

1
public abstract class AbstractMap<K, V> implements Map<K, V>

对应于AbstractCollectionAbstractMap的作用也是类似的,主要是针对 Map 提供一些方法的通用实现。如果需要实现一个不可修改的 Map,只需要继承 AbstractMap 并重写 entrySet 方法。entrySet 方法返回的 Set 集合不应该支持 add、remove 方法,其迭代器也不应该支持 remove 方法。要实现可修改的 Map,必须重写此类的 put 方法(AbstractMap 默认抛出 UnsupportedOperationException 异常)和 entrySet 方法。iterator 方法返回的迭代器必须实现 remove 方法。

entrySet 方法在 AbstractMap 中仍然是一个抽象方法。

1
public abstract Set<Entry<K,V>> entrySet();

另外在 AbstractMap 中定义了两个变量,这两个变量在 AbstractMap 的子类 HashMap、TreeMap 都有用到。被用来存储返回的集合视图。

1
2
3
4
// 存储 key 集合
transient Set<K> keySet;
// 存储 values
transient Collection<V> values;

abstractsequentiallist

( Sequential 相继的,按次序的)

AbstractSequentialList 继承自 AbstractList,是 LinkedList 的父类,是 List 接口 的简化版实现。

简化在哪儿呢?简化在 AbstractSequentialList 只支持按次序访问,而不像 AbstractList 那样支持随机访问。

想要实现一个支持按次序访问的 List的话,只需要继承这个抽象类,然后把指定的抽象方法实现就好了。需要实现的方法:

  • size()
  • listIterator(),返回一个 ListIterator

你需要实现一个 ListIterator, 实现它的 hasNext(), hasPrevious(), next(), previous(), 还有那几个 获取位置 的方法,这样你就得到一个不可变的 ListIterator 了。如果你想让它可修改,还需要实现 add(), remove(), set() 方法。

正如在 每个 Collection 接口 中提倡的那样,AbstractSequentialList 的子类需要提供两个构造函数,一个无参,一个以 Collection 为参数。

评论