获取集合元素的最快方法是什么?

时间:2012-02-01 15:42:04

标签: java list collections

我有一个List<Pair<String, String>>我希望从Collection复制数据。

阅读该集合并将项目添加到列表的最佳方式是什么?

List<Pair<String, String>> identityMemoPairs = new LinkedList<Pair<String, String>>();
Collection result = handler.getResult();

    while(result.iterator().hasNext()){
         IdentityM im =(IdentityM) result.iterator().next();
         identityMemoPairs.add(Pair.of(im.identity,im.memo));
    }

2 个答案:

答案 0 :(得分:3)

您的代码是错误的,因为您在while循环的每次迭代中都创建了一个新的迭代器(实际上您创建了两个迭代器)。每个新的迭代器都将指向result集合的开头。因此,您创建了一个无限循环。

要解决此问题,请只调用result.iterator()一次,然后将结果存储在变量中。

但更好(更好阅读,更不容易出错)将是for-each循环,它(几乎总是)是迭代集合的首选变体:

for (IdentityM im : (Collection<IdentityM>)result) {
  identityMemoPairs.add(Pair.of(im.identity,im.memo));
}

编译器会使用迭代器自动将其转换为代码,因此没有性能差异。一般来说,只要避免在get(i)上调用LinkedList等一些不好的事情,在迭代集合时性能就不是问题。

请注意,编译器会在这里给出一个警告,它与迭代无关,但是使用原始类型Collection(而不是Collection<IdentityM>)。请检查handler.getResult()是否实际返回Collection<IdentityM>并尽可能将result变量的类型更改为此。

另一个问题是你是否真的需要该列表作为对列表。通常不建议使用普通对类,因为它们的名称不显示它们所代表的对象的含义。例如,最好使用类PersonName,其中包含名字和姓氏的字段,而不是Pair<String, String>。你为什么不能只使用List<IdentityM>?如果你可以使用它,你确定你不能使用Collection<IdentityM>吗? (ListCollection通常可以互换。)然后您可以完全避免复制。

答案 1 :(得分:0)

你的代码很好。但是你可能会让handler直接返回一个Pairs集合,这样你就可以调用identityMemoPairs.addAll()而不是自己迭代集合。但这只会使它“更漂亮”,但它不能提供更多性能。