Информация об изменениях

Сообщение Re[9]: Ситуация на рынке труда в Питере от 27.01.2016 10:07

Изменено 27.01.2016 10:17 sadpotato

Здравствуйте, TMU_1, Вы писали:

>>ну и несут всякую ахинею что LinkedList занимает меньше памяти чем ArrayList,



TMU>Я, я знаю, чем они отличаются!

TMU>Кстати, на практике часто бывают ситуации, что один перед другим (или другой перед одним) имеют явное, то есть заметное преимущество?
TMU>А то регулярно слышу: пользуй ArrayList и не заморачивайся.

На практике зависит. Все что написано ниже относится только к использованию в режиме read-only.

При сильно фрагментированном хипе элементы LinkedList могут быть расположены далеко друг от друга, в таком случае при последовательном проходе по списку префетчи в кэш будут грузить всякий мусор, и каждый следующий элемент будет доставаться из основной памяти. Хотя я не уверен, что компилятор вообще будет генерировать префетчи для LinkedList. Вдобавок LinkedList в Java — doubly linked, так что на каждый элемент дополнительно надо хранить 2 ссылки. Если у тебя объекты маленького размера, то разница в использовании памяти по сравнению с ArrayList будет ощутима...

У ArrayList в read-only режиме один недостаток — непредсказуемое в теории время добавления нового элемента в конец списка (засчет периодических удвоений). Реально же порядок максимального количества элементов обычно известен заранее, так что для гарантированного O(1) для add нужно всего лишь не жлобить память.
Здравствуйте, TMU_1, Вы писали:

>>ну и несут всякую ахинею что LinkedList занимает меньше памяти чем ArrayList,



TMU>Я, я знаю, чем они отличаются!

TMU>Кстати, на практике часто бывают ситуации, что один перед другим (или другой перед одним) имеют явное, то есть заметное преимущество?
TMU>А то регулярно слышу: пользуй ArrayList и не заморачивайся.

На практике зависит. Все что написано ниже относится только к использованию в режиме read-only.

При сильно фрагментированном хипе элементы LinkedList могут быть расположены далеко друг от друга, в таком случае при последовательном проходе по списку префетчи в кэш будут грузить всякий мусор, и каждый следующий элемент будет доставаться из основной памяти. Хотя я не уверен, что компилятор вообще будет генерировать префетчи для LinkedList. Вдобавок LinkedList в Java — doubly linked, так что на каждый элемент дополнительно надо хранить 2 ссылки. Если у тебя объекты маленького размера, то разница в использовании памяти по сравнению с ArrayList будет ощутима...

У ArrayList в read-only режиме один недостаток — непредсказуемое в теории время добавления нового элемента в конец списка (засчет периодических удвоений). Реально же порядок максимального количества элементов обычно известен заранее, так что для гарантированного O(1) для add нужно всего лишь не жлобить память.

Еще кстати ArrayList в отличие от LinkedList реализует java.util.RandomAccess, что подразумевает некоторые оптимизации при использовании Collections.sort (см. доку)