类:自定义集合实现

许多程序员永远不需要实现自己的Collection s 类。您可以使用本章前面各节中描述的实现进行深入研究。但是,有一天您可能想编写自己的实现。借助于 Java 平台提供的抽象实现,这样做非常容易。在讨论如何编写实现之前,让我们先讨论为什么要编写一个实现。

编写实现的原因

以下列表说明了您可能要实现的自定义Collection的种类。它并非旨在详尽无遗:

如何编写自定义实现

编写自定义实现非常容易。 Java Collections Framework 提供了专门设计用于促进自定义实现的抽象实现。我们将从以下实现Arrays.asList的示例开始。

public static <T> List<T> asList(T[] a) {
    return new MyArrayList<T>(a);
}

private static class MyArrayList<T> extends AbstractList<T> {

    private final T[] a;

    MyArrayList(T[] array) {
        a = array;
    }

    public T get(int index) {
        return a[index];
    }

    public T set(int index, T element) {
        T oldValue = a[index];
        a[index] = element;
        return oldValue;
    }

    public int size() {
        return a.length;
    }
}

信不信由你,这与java.util.Arrays中包含的实现非常接近。就这么简单!您提供了一个构造函数,并提供了getsetsize方法,其余的全部由AbstractList完成。您可以免费获得ListIterator,批量操作,搜索操作,哈希码计算,比较和字符串 表示。

假设您想使实现更快一些。用于抽象实现的 API 文档精确描述了每种方法的实现方式,因此您将知道要覆盖哪些方法才能获得所需的性能。前面的实现的性能很好,但是可以改进一点。特别地,toArray方法在List上迭代,一次复制一个元素。给定内部表示形式,仅克隆阵列就更快,更明智。

public Object[] toArray() {
    return (Object[]) a.clone();
}

加上此覆盖和更多类似的覆盖,此实现正是在java.util.Arrays中找到的实现。为了完全公开,使用其他抽象实现会有些困难,因为您将不得不编写自己的迭代器,但仍然没有那么困难。

以下列表总结了抽象的实现:

编写自定义实现的过程如下:

首页