我有一个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>
? ( List
和 Collection
通常是可以互换的。)然后您就可以完全避免复制。
关于java - 获取集合元素的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9098695/