2014-11-13 3 views
-1

Как говорится в названии. Какая из двух следующих функций является наиболее эффективной для 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); 
     } 
    } 
    } 

Если кто-то может объяснить мне, почему одна функция более тяжелая, чем другая, это было бы здорово!

+2

первый будет работать один, второй один будет кидает исключение, пойти с первым одним – user902383

+0

Они делают разные вещи: один вносит изменения в список, еще один возвращает другой список. Вы не можете сравнивать их таким образом. –

+0

Как вы их оценили? Они выполняют разные функции. Конечно, второй (если он правильный) быстрее, потому что он не создает никаких объектов. И, кроме того, второй не делает того, что он должен был делать. Почему «фильтр», когда он просто удаляет элемент из списка? –

ответ

1

Обычно его не хорошая идея, чтобы удалить элементы в ArrayList в цикле, если вы хотите что-то похожее на второй идее, вы должны использовать итератор:

Iterator<Car> it = cars.iterator(); 
while (it.hasNext()) { 
    Car myCar = it.next(); 
    if (something) { 
     it.remove(); 
    } 
} 
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); 
     } 
    })); 
    } 
+0

Обратите внимание, что этот метод возвращает только коллекцию, а не список. Вам нужно будет «вылить» результат фильтрации в новый список. – Natix

Смежные вопросы