文档

Java™教程
路径:集合

课程:自定义集合实现

许多程序员永远不需要实现自己的Collection类。使用本章前面描述的实现可以走得相当远。然而,总有一天你可能想要编写自己的实现。在Java平台提供的抽象实现的帮助下,这相当容易。在讨论如何编写实现之前,让我们先讨论为什么可能想要编写一个实现。

编写实现的原因

以下列表列举了您可能想要实现的自定义Collection的类型。这不是详尽无遗的列表:

如何编写自定义实现

编写自定义实现非常简单。Java集合框架提供了专门用于方便自定义实现的抽象实现。我们将从以下示例开始,这是一个实现了 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中的实现一样了。为了公正起见,使用其他抽象实现要稍微困难一些,因为您将需要编写自己的迭代器,但也不是那么难。

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

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

  1. 从上述列表中选择适当的抽象实现类。
  2. 提供类的所有抽象方法的实现。如果要修改自定义集合,则还必须覆盖一个或多个具体方法。抽象实现类的API文档会告诉您应该覆盖哪些方法。
  3. 测试并调试实现。现在您拥有一个可工作的自定义集合实现。
  4. 如果您关注性能,请阅读继承的所有方法的抽象实现类的API文档。如果有任何方法看起来太慢,请覆盖它们。如果覆盖了任何方法,请务必在覆盖之前和之后测量方法的性能。您在调整性能方面投入的努力应取决于实现的使用程度以及其使用对性能的关键程度。(通常最好省略此步骤。)

上一页:前一课程
下一页:互操作性