这两个功能中哪一个最重要

时间:2014-11-13 14:20:12

标签: java performance

正如标题所说。以下两个函数中的哪一个对于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 个答案:

答案 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);
        }
    }));
    }