【发布时间】:2017-02-02 05:38:55
【问题描述】:
我很清楚使用外部索引 (forloop) 迭代 LinkedList 的成本。查看LinkedList#listIterator 返回的ListIterator 的源代码,我注意到它通过跟踪当前使用的节点显着加快了进程。
但是,我最近遇到了this question,它基本上是关于同时迭代两个或多个列表,但需要在跟踪索引以将值传输到数组的同时这样做。在我看来,这使得迭代器的使用有点多余,并且更容易出现人为错误,因为每个迭代器都需要单独的声明,在循环和调用每个 next 方法之上。这就是我尝试避免使用迭代器循环组合的原因。以下是该问题的可能解决方案:
List<Integer> listOne = new ArrayList<>();
List<Integer> listTwo = new ArrayList<>();
int[] combined = new int[(listOne.size() < listTwo.size() ? listOne.size() : listTwo.size())];
for (int i = 0; i < combined.length; i++) {
combined[i] = listOne.get(i) + listTwo.get(i);
}
这对于ArrayList 来说很好,但是对于LinkedList 来说这将是一个相当缓慢的操作。
一种可能的解决方案是使用ArrayList 的转换构造函数从LinkedList 获取所有引用:
//convert linkedlists to arraylists
ArrayList<Integer> arrayListOne = new ArrayList<>(listOne);
ArrayList<Integer> arrayListTwo = new ArrayList<>(listTwo);
//iterate with an efficient get() operation
for (int i = 0; i < combined.length; i++) {
combined[i] = listOne.get(i) + listTwo.get(i);
}
既然这样只会调用每个LinkedListonce的迭代器,然后使用效率更高的ArrayList#get方法,这是一个可行的方案吗?转换的开销是否会抵消效率增益?这种方法还有其他缺点吗?
【问题讨论】:
-
@MouseEvent 因此对
combined进行大小检查;)
标签: java arraylist collections linked-list