1

我有一个通用对象类型的 ArrayList,即列表队列。我想写一个函数EnqueueModified,它以一个arraylist和一个list对象作为输入,并返回另一个ArrayList,其中包含旧arraylist和list对象的元素,但不影响传递的原始arraylist。ie Enqueue 操作应该在arraylist 的新副本上执行并返回。

这可以按如下方式完成:

    public List<E> EnqueueModified(E e, List<E> queue) {
    List<E> clone = new ArrayList<E>(queue);
    clone.add(e);
    return clone;

}

但是有没有更好的方法来做到这一点?有没有更快的方法来创建列表的副本,而不是使用复制构造函数?我不能使用克隆,因为它不支持通用列表。

4

1 回答 1

2

要复制列表,您必须创建一个新列表并用旧列表中的项目填充它。

但是,您使用的构造函数实际上可能不是最佳选择。如果您检查源代码(google arraylist 源代码),您会注意到它创建的数组与旧集合中的元素一样大。

然后它将一个元素添加到该数组中。因为数组太小,它必须创建数组的另一个副本,只是稍微大一点,然后再次将元素移动到那里。

您可以通过使用获得更好的性能

clone = new ArrayList(queue.size() + 1);
clone.addAll(queue);
clone.add(e);

此外,方法名称应以小写字母开头。所以使用: enqueueModified(...)

于 2013-11-07T14:05:52.637 回答