2013-09-18 4 views
10

Мне нужен «Список» или «Карта», ... объекта A. Этот список будет добавлен из другого ArrayList. Объект A считается равным другому, если параметр id равен A.Использование ArrayList или HashMap для лучшей скорости

Моя проблема: я хочу добавить объект, которого нет в моем списке. Я задаюсь вопросом между двумя альтернативами реализации. Использование ArrayList или HashMap

1. ArrayList: 

for (A a: source) {if (! (a in ArrayList)) addToArrayList();} 

2. HashMap <id, A> 

for (A a: source) {hasmap.put (a.id, a)} 

который даст более высокую скорость, чтобы добавить большое количество (более 1000 объектов, или большее количество объектов) есть лучший образец для моей проблемы ???

+0

Почему бы вам не проверить? – davidkonrad

+2

Я хочу знать, есть ли какой-либо лучший шаблон для моей проблемы. – hieuxit

+1

Если вы хотите вставлять элементы, которые еще не собраны, почему бы не использовать 'Set'? –

ответ

16

Во-первых, я собираюсь выйти на конечность и заявить, что это две совершенно разные структуры данных: . A List имеет дело с линейным представлением элементов, а Map имеет дело с значениями пары ключей.

Чувство моего желания заключается в том, что вы пытаетесь выбрать между List и Set.

Если вы хотите ввести только уникальные элементы, или, выражаясь более кратко, если вы заботитесь только об уникальных значений, то Set какой-то ваш лучший выбор - вероятно HashSet, если вы не заботитесь о упорядоченность. It provides O(1) time для основных операций, таких как добавление, удаление, содержит и размер.

(Интересно, что HashSet подкреплена HashMap, но и обеспечивает интерфейс, похожий на ArrayList.)

+0

Да, это именно то, что я хочу. большое спасибо. – hieuxit

+0

@ Makoto Не HashMap поддерживается HashSet? – Mani

+0

Бонус: Java имеет [LinkedHashSet] (http://docs.oracle.com/javase/8/docs/api/java/util/LinkedHashSet.html), который выполняет итерацию в порядке вставки, таком как списки. – DerMike

41

ArrayList имеет производительность O (n) для каждого поиска, поэтому для n поиска его производительность равна O (n^2).

HashMap имеет производительность O (1) для каждого поиска (в среднем), поэтому для n поиска его производительность будет равна O (n).

Пока HashMap будет медленнее сначала и займет больше памяти, он будет быстрее при больших значениях n.

Причина, по которой ArrayList имеет производительность O (n), заключается в том, что каждый элемент должен быть проверен для каждой вставки, чтобы убедиться, что его еще нет в списке. Мы будем делать n вставок, поэтому для всей операции O (n^2).

Причина, по которой HashMap имеет производительность O (1), заключается в том, что алгоритм хэширования принимает одно и то же время для каждого ключа, а затем поиск для поиска ключа также занимает постоянное время. Могут быть случаи, когда хеш-таблица превышает ее коэффициент загрузки и должна быть перераспределена, и это почему она постоянна на avarage.

Итак, чтобы ответить на ваш вопрос, я советую использовать HashMap.

+0

Спасибо за ваш ответ !!!. – hieuxit

+0

И как сказал @ Крис Хейс, Set (HashSet) - лучшее решение ???. Я думаю, что Set имеет такую ​​же производительность с ArrayList ?? – hieuxit

+2

'Set' - это интерфейс. «HashSet» - это реализация, которая в целом будет работать лучше здесь. 'TreeSet' будет выполнять между двумя, но гарантировать порядок поверх уникальности. –

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