正如标题所说。以下两个函数中的哪一个对于jvm而言是最重要的。
protected List<Car> filterByNote(String note, List<Car> cars)
{
List<Car> tempList = new ArrayList<>();
for(Car c : cars)
{
if(c.getNotes().contains(note))
{
tempList.add(c);
}
}
return tempList;
}
protected void filterByNote2(String note, List<Car> cars)
{
for(Car c : cars)
{
if(!c.getNotes().contains(note))
{
cars.remove(c);
}
}
}
如果有人能向我解释为什么一个功能比另一个功能更重,那就太好了!
答案 0 :(得分:1)
通常在for循环中删除arraylist中的元素并不是一个好主意,如果你想要类似于第二个想法的东西,你应该使用迭代器:
Iterator<Car> it = cars.iterator();
while (it.hasNext()) {
Car myCar = it.next();
if (something) {
it.remove();
}
}
答案 1 :(得分:0)
第二种方法可能会引发异常ConcurrentModificationException,因为您在迭代期间更改了列表。尝试使用具有良好功能过滤器的GoogleGuava:
protected List<Car> filterByNote(final String note, List<Car> cars) {
return new ArrayList(Collections2.filter(cars, new Predicate<Car>() {
@Override
public boolean apply(Car input) {
return input.getNotes != null && !input.getNotes.isEmpty() && input.getNotes().contains(note);
}
}));
}