2008-09-11 4 views
6

При создании классов в Java я часто нахожу, что создаю коллекцию на уровне экземпляра, которую я знаю заранее, будет очень маленьким - менее 10 элементов в коллекции. Но я не знаю количество элементов загодя, поэтому я обычно выбираю динамическую коллекцию (ArrayList, Vector и т. Д.).Использование небольших (1-10 элементов) Коллекции экземпляров в Java

class Foo 
{ 
    ArrayList<Bar> bars = new ArrayList<Bar>(10); 
} 

Часть меня держит нытье на меня, что это расточительно использовать сложные динамические коллекции что-то в этом небольшом по размеру. Есть ли лучший способ реализовать что-то подобное? Или это норма?

Примечание. Я не подвергаюсь никаким (заметным) штрафам за исполнение или что-то в этом роде. Мне просто интересно, нет ли лучшего способа сделать что-то.

ответ

11

Класс ArrayList в Java имеет только два элемента данных, ссылку на массив Object[] и размер, который вам нужен в любом случае, если вы не используете ArrayList. Поэтому единственным преимуществом не использовать ArrayList является сохранение одного распределения объектов, что вряд ли когда-либо будет иметь большое значение.

Если вы создаете и утилизации многих, многих случаях вашего класса контейнера (и расширением вашей ArrayList экземпляра) каждый второй, вы мощь есть небольшая проблема с сборщика мусора маслобойки, но это что-то беспокоиться о если это когда-либо произойдет. Сбор мусора обычно является наименьшим из ваших забот.

1

Накладные расходы очень маленькие. Можно написать список гибридных массивов, в котором есть поля для первых нескольких элементов, а затем возвращается к использованию массива для более длинного списка.

Вы можете полностью избежать накладных расходов объекта списка, используя массив. Чтобы еще больше хардкор, вы можете объявить это поле как Object и полностью исключить массив для одного элемента.

Если память действительно является проблемой, вы можете забыть об использовании экземпляров объектов на низкоуровневом уровне. Вместо этого используйте большую структуру данных на более высоком уровне детализации.

+0

Ничто из того, что вы говорите, само по себе не так, но я не хотел бы делать ничего из этого. Сложность, связанная с каким-то динамическим перемещением между объектами -> массивом -> ArrayList, настолько велика, и стоимость просто создания простого массива ArrayList настолько мала, что я думаю, что это просто плохое предложение – 2008-09-11 17:53:26

+0

Это редко бывает важно, но когда это важно он фиксируется. Например, javac делает странные вещи, чтобы память, используемая строками, была небольшой, поэтому мы все выигрываем от более быстрых и небольших компиляций. – 2008-10-04 17:51:04

3

Для удобства вещей я считаю, что это не проблема. Ваша реализация достаточно гибкая, чтобы в случае изменения требований в будущем вы не подвергались рефакторингу. Кроме того, добавление дополнительной логики в ваш код для гибридного решения просто не стоит того, чтобы учитывать ваш небольшой набор данных и высококачественный API-интерфейс Java.

2

Google Collections имеет коллекции, оптимизированные для неизменного/небольшого количества элементов. См. Пример API Lists.asList.