Влияет ли конкретный тип на производительность ArrayList? - PullRequest
0 голосов
/ 09 августа 2011

Интересно, имеют ли ArrayList<SimpleObject> и ArrayList<ComplexObject> разное влияние на производительность, если речь идет об использовании памяти и скорости навигации (foreach, getAt ())? Почему?

Спасибо

Ответы [ 3 ]

2 голосов
/ 09 августа 2011

Ваш вопрос не очень ясен в отношении того, что вы ищете, поэтому я сделал несколько предположений относительно того, что вы ищете.

Если вас беспокоит память, используемая списком, тоэто будет зависеть от фактического размера объектов, управляемых ArrayList.Если SimpleObject s легче по сравнению с ComplexObjects, то память, используемая в куче, будет выше в последнем случае.Однако фактическая память, используемая списками массивов, будет более или менее постоянной для массивов одинакового числа объектов, поскольку списки содержат только ссылки на фактические объекты в куче.

По теме производительности во время выполнения, это зависит от вызываемого метода.Такие методы, как get(int index) и add(E element), всегда будут иметь одинаковые характеристики производительности во время выполнения, независимо от используемого типа.Это связано с природой метода: их поведение не зависит от типа Объекта, присутствующего в списке.

С другой стороны, производительность indexOf(Object object) будет зависеть от того, как equals метод реализован.Для тривиальных случаев было бы легко сделать вывод, что indexOf будет работать быстрее для ArrayList<SimpleObject>, чем для ArrayList<ComplexObject>, при условии, что реализация equals() для SimpleObject будет работать быстрее, чем реализация ComplexObject.

Если вас беспокоит потребление памяти во время выполнения методов ArrayList, то оно не обязательно должно быть другим, так как большинство методов отрабатывают ссылки на объекты.Существуют исключения, такие как toArray(), которые требуют меньше памяти для SimpleObject, чем для ComplexObject.

2 голосов
/ 09 августа 2011

Нет, разницы в производительности нет. Есть два очень простых аргумента, объясняющих это:

  • ArrayList только когда-либо обрабатывает ссылки, и ссылки всегда имеют одинаковый размер, независимо от сложности, на которую они указывают.
  • Обобщения реализованы с использованием стирания, что по сути означает, что во время выполнения информация, которая является ArrayList<SimpleObject>, а другая - ArrayList<ComplexObject>, недоступна , это всего лишь ArrayList объекты для время выполнения.
1 голос
/ 09 августа 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...