【发布时间】:2014-04-04 20:41:16
【问题描述】:
我已经有一个List<T>,它可能包含也可能不包含重复项。我将根据使用它们的一些计算结果构建一个Set<String>,因为在某些情况下,两个不同的Ts 可以产生相同的String。
List<T> 中的一些元素有不受欢迎的属性,所以我需要将它们过滤掉。我这样过滤:
List<T> myList = myCoolListGetter();
Iterator<T> it = myList.iterator();
T curr;
while (it.hasNext()) {
curr = it.next();
if (curr.shouldNotBeInResult()) {
myList.remove(curr);
}
}
然后我将这个List<T> 传递给另一个方法,该方法执行我提到的那些计算,将它们添加到Set<String>。
我想也许我可以通过将应该在结果中的元素插入Set<T> 而不是从List<T> 中删除它们来节省一些时间。由于我已经在这里迭代了List<T>,并且无论如何都必须稍后构造一个Set<String>,所以我真的可以通过这样做来节省时间吗?
【问题讨论】:
-
我会说使用前一种方法,因为它更干净并且可以按预期执行。除了您应该使用
it.remove而不是myList.remove(curr)以更快地删除。 -
您可以使用
System.currentTimeMillis()获取开始时间,然后创建Set并再次调用System.currentTimeMillis()获取结束时间。结束时间减去开始时间,得到经过的时间。重复List删除方法并比较结果。 -
@MikeB 将进行微基准测试。在尝试进行此类测试之前,请参阅How do I write a correct micro-benchmark in Java?。
-
在问“什么更快?”之前,你应该先问,“这有关系吗?”
-
@LieRyan 有时会,这取决于您正在使用的系统类型。我正在开发的当前系统是基于这种方法制作的就是提升所有系统的性能...