Выбор во многом зависит от того, что вы хотите с ним делать.
Если это то, что упоминается в вашем вопросе:
У меня есть коллекции объектов, которые гарантированно будут различны (в частности, индексируются уникальный целочисленный ID). Я также знаю точно сколько из них есть
Если это то, что вам нужно сделать, то вам нужно ни один из них.Существует метод size() в Collection, для которого вы можете получить его размер, что означает , сколько из них в коллекции.
Если вы имеете в виду «коллекцию объектов», это не коллекция, и вам нужно выбрать тип коллекции для хранения ваших объектов для дальнейшей обработки, тогда вам нужно знать, для разных типов коллекций имеют разные возможности и характеристики.
Во-первых, я считаю, что у вас есть справедливое сравнение, вы должны использовать ArrayList вместо Array, для которого вам не нужно иметь дело с перераспределением.
Затем он стал выбор ArrayList против HashSet, который довольно прямолинейно:
вам нужен список или Set? Они предназначены для разных целей: списки предоставляют вам индексированный доступ, а итерация - в порядке индекса. В то время как Sets предназначены в основном для того, чтобы вы сохраняли отдельный набор данных и, учитывая его природу, у вас не будет индексированного доступа.
После того, как вы решили использовать List или Set, это выбор реализации List/Set, обычно для списков, вы выбираете ArrayList и LinkedList, а для Sets - HashSet и TreeSet.
Все зависит от того, что вы хотели бы сделать с этой коллекцией данных. Они действуют по-разному на разных действиях.
Например, индексированный доступ в ArrayList является O (1), в HashSet (хотя и не значимым) является O (n) (только для вашего интереса, в LinkedList есть O (n), в TreeSet есть O (nlogn))
Для добавления нового элемента, как ArrayList, так и HashSet - это операция O (1). Вставка в середине - это O (n) для ArrayList, хотя это не имеет смысла в HashSet. Оба будут страдать от перераспределения, и для обоих из них требуется O (n) для перераспределения (HashSet обычно медленнее в перераспределении, поскольку он включает в себя вычисление хэша для каждого элемента снова).
Чтобы определить, существует ли определенный элемент в коллекции, ArrayList - это O (n), а HashSet - O (1).
Есть еще много операций, которые вы можете сделать, поэтому совершенно бессмысленно обсуждать результаты, не зная, что вы хотите делать.
Является ли ваш набор данных редкими или плотными? –
HashSet предназначен для ожидающих постоянных операций 'add',' contains' и 'remove', что означает, что время не изменится, независимо от количества элементов в наборе. Массивы имеют линейные операции для всех этих, но более низкие накладные расходы. Это означает, что массивы обычно будут лучше для небольших наборов. Недавно я провел несколько тестов на своей машине с реализацией ArraySet и обнаружил, что обычно более 150 элементов используют Array, а не Hash (но это немного зависит от реализации и операций: Итерация была гораздо быстрее, например). – Ghostkeeper
Есть миллионы мнений об этом. Http://www.javacodegeeks.com/2010/08/java-best-practices-vector-arraylist.html и http://www.ibm.com/developerworks/library/j -jtp02183/ –