我有一个通用对象类型的ArrayList,即List队列。我想编写一个函数EnqueueModified,它将一个arraylist和一个列表对象作为输入,并返回另一个包含旧arraylist和list对象的元素的ArrayList,但不影响传递的原始arraylist。即,应该在arraylist的新副本上执行入队操作并返回。
这可以按如下方式完成:
public List<E> EnqueueModified(E e, List<E> queue) {
List<E> clone = new ArrayList<E>(queue);
clone.add(e);
return clone;
}
但有更好的方法吗?而不是使用复制构造函数,有没有更快的方法来创建列表的副本?我不能使用克隆,因为它不支持通用List。
答案 0 :(得分:2)
要复制列表,您必须创建一个新列表并使用旧列表中的项目填充它。
但是,您使用的构造函数实际上可能不是最佳选择。如果您检查源代码(google arraylist源代码),您会注意到它创建的数组与旧集合中的元素一样大。
然后它向该数组添加一个元素。因为数组太小,所以必须创建数组的另一个副本,只需稍微大一点,然后再将元素移动到那里。
使用
可以获得更好的表现clone = new ArrayList(queue.size() + 1);
clone.addAll(queue);
clone.add(e);
此外,方法名称应以小写字母开头。所以使用:enqueueModified(...)