Я разработал список массивов что-то вроде этого
ArrayList list = new ArrayList(); list.add("1"); list.add("8"); list.add("8"); list.add("3"); list.add("4");
Теперь мой вопрос: если я хочу удалить «8» из списка, какой путь лучше?
первый путь:
for(int i = 0; i < list.size(); i++) { if(list.get(i).equals("8")) { list.remove(i); i--; } }
второй путь:
Iterator iterator = list.iterator(); while(iterator.hasNext()) if(iterator.next().equals("8")) iterator.remove();
вIterator iterator = list.iterator(); while(iterator.hasNext()) if(iterator.next().equals("8")) iterator.remove();
Теперь, пожалуйста, сообщите, какой из них более эффективен и быстрее с точки зрения производительности, а также есть какой-либо другой способ, который является чем-то вроде встроенной функции, используя его, мы можем удалить дубликат без повторения этого многого.
Производительность должна быть одинаковой. Вы протестировали? Если вы хотите использовать встроенные методы, вы можете сделать это с аналогичной производительностью (подтверждается тестированием):
list.removeAll(Arrays.asList("8"));
Наконец, если вам нужен список без дубликатов, используйте Set, как упомянули другие.
Если вам просто нужен набор чисел, используйте HashSet
а не List
. Если вам нужно сохранить порядок, по которому вы помещаете цифры, используйте LinkedHashSet
. Что касается удаления, всегда предпочитайте версию с iterator
, хотя в вашем конкретном случае производительность может быть сопоставимой. Идиома с iterator
более широко применима, чем индексирование, например, если вы использовали LinkedList
, индексирование приведет к катастрофической производительности.
Если вам нужно сохранить дубликаты, я предлагаю вам использовать Map
где первое целое является ключом, а второе – числом ключевых вхождений. Поэтому, когда вы добавляете уже существующий ключ, вы просто увеличиваете соответствующий счетчик. (В операции удаления вы делаете наоборот). Когда вам нужны все разные значения, вы просто используете Map.keySet ().