繁体   English   中英

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

[英]What is the fastest way to get the elements of a collection?

我有一个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));
    }

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

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

但是,更好的方式(更好地阅读,更不易出错)将是for-each循环,它(几乎总是)是遍历集合的首选变体:

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

编译器将使用迭代器将其自动转换为代码,因此没有性能差异。 通常,只要避免一些不好的事情,例如在LinkedList上调用get(i)对集合进行迭代时,性能始终不是问题。

请注意,编译器将在此处向您发出警告,该警告与迭代无关,但与原始类型Collection (而不是Collection<IdentityM> )的使用有关。 请检查handler.getResult()实际上返回Collection<IdentityM>并在可能的情况下将result变量的类型更改为此。

另一个问题是您是否真的需要将该列表作为成对的列表。 通常不建议使用纯对类,因为它们的名称不显示其表示的对象的含义。 例如,最好使用PersonName类,该类具有用于名字和姓氏的字段,而不要使用Pair<String, String> 为什么不能只使用List<IdentityM> 并且,如果可以使用它,确定不能使用Collection<IdentityM>吗? ListCollection通常可以互换。)这样就可以避免完全复制。

您的代码确实很棒。 但是您可以使handler直接返回一个Pairs集合,因此您可以调用identityMemoPairs.addAll()而不是自己迭代该集合。 但这只会使其“更漂亮”,而不会提供更多性能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM