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

标签 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));
    }

最佳答案

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

要解决此问题,请调用 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 的类型如果可能的话可以变量。

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

关于java - 获取集合元素的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9098695/

相关文章:

java - 为什么这段代码不起作用?刽子手

java - 哪些面向 GlassFish 2.1 和 NetBeans 6.7 的技术?

java - 将 System.out.println 或 stdout 数据捕获到 swing 备忘录(大数据)

java - 对 map 列表进行排序

python - 如何在Python中将嵌套列表拆分为多个列表?

java - 在 Java 7 或更低版本中,HOWTO 使用在 map 中找到的键/值来过滤 map 对象列表

ruby-on-rails - 阵列::包括?在 ActiveRecord 集合上不调用 op==?

java - 将 ECPublicKey 从 JavaCard 恢复到 Java

Java : Priority Queue

java - 具有相同JMS相关性ID的重复消息