Vector или ArrayList – что лучше и почему?
Найдите разницу между Vector’ом и ArrayList’ом.
Иногда лучше использовать Vector, иногда ArrayList, в некоторых случаях лучше не использовать ни то ни другое. Существует четыре фактора, влияющих на принятие решения – что и когда лучше использовать, а именно:
- API
- Синхронизация
- Хранение данных
- Реализация
Давайте более подробно остановимся на каждом из них.
API
В издании The Java Programming Language (Addison-Wesley, June 2000) Кен Арнолд, Джеймс Гослинг и Девид Холмс описывают Vector как аналог ArrayList’а. Из этого следует, что с точки зрения API, оба класса очень похожи. Тем не менее, между этими двумя классами всё-таки есть существенные различия.
Синхронизация
Экземпляры класса Vector являются синхронизированными и каждый метод класса Vector является потокобезопасным, в то время как ArrayList имеет прямо противоположное описание: он не является синхронизированным и не является потокобезопасным. Из этого следует, что использование Vector’a в конечном итоге понижает производительность из-за обеспечения синхронизированного доступа к данным коллекции. Поэтому, если вам не нужна коллекция, обеспечивающая потокобезопасный доступ к данным (т.е. Vector), используйте ArrayList, зачем платить больше?
Хранение данных
Обе коллекции Vector и ArrayList используют массив для хранения данных. Вам нужно помнить об этом всегда. Массив, хранящий элементы, расширяется в том случае, когда он уже является полностью заполненным в момент добавления нового элемента. Каким образом реализуется расширение массива? Если мы просмотрим исходный код классов Vector и ArrayList, мы заметим, что в Vector’е происходит увеличение массива вдвое, в то время как в ArrayList’е массив увеличивается на 50%. Это является ещё одним местом, где может осуществляться существенное падение производительности. Поэтому, создавая коллекцию, задумайтесь, какой именно коэффициент вместимости (инишиал кепестити) нужен коллекции, и нужен ли он вообще. Это позволит вам избежать дополнительных расходов при расширении массива.
Реализация
Обе коллекции Vector и ArrayList являются хорошим решением при индексировании данных, извлечении элементов с определённой позиции, а так же при добавлении/удалении элемента в/из конец/конца списка. Если вы хотите добавлять/удялать элементы в начале либо в середине списка, используйте LinkedList. Этот класс позволяет добавлять либо удалять элементы с любых позиций за фиксированное время O(1). Однако индексирование в LinkedList обойдётся вам дороже чем в Vector/ArrayList по времени и определяется как O(i), где i – индекс элемента.
Если вы разрабатываете код, где производительность играет первоочередную роль, задумайтесь над использованием массива вместо списка – это позволит вам избежать затрат на синхронизацию, затрат на вызов методов, а также затрат на расширение массива. Но за это вам придеться расплачиваться временем, затраченным на разработку.
Источник: JavaWorld
Какими бывают транзакции в Spring?
Заметьте, данный пост не является справочником по работе с транзакциями в Spring, а лишь описывает способы распространения транзакций.
Пожалуйста, будьте ознакомлены с разницей между физическими и логическими транзакциями.
В посте рассматривается версия Spring 2.5.4
Транзакции в Spring могут принимать следующие значения:
- REQUIRED – Является значением по умолчанию. Поддерживает текущую транзакцию, создает новую если транзакция ещё не существует. Аналогичен с атрибутом в EJB транзакции с таким же именем.
- SUPPORTS – Поддерживает текущую транзакцию, а так же выполняется вне транзакции, если на момент выполнения транзакция не была создана. Аналогичен с атрибутом в EJB транзакции с таким же именем.
- MANDATORY – Поддерживает текущую транзакцию, если на момент выполнения транзакция не была создана, выбрасывается исключение. Аналогичен с атрибутом в EJB транзакции с таким же именем.
- REQUIRES_NEW – Создает новую транзакцию, приостанавливает текущую транзакцию (если она существует). Аналогичен с атрибутом в EJB транзакции с таким же именем.
- NOT_SUPPORTED - Выполняется вне транзакции, приостанавливает текущую транзакцию (если она существует). Аналогичен с атрибутом в EJB транзакции с таким же именем.
- NEVER - Выполняется вне транзакции, выбрасывается исключение, если транзакция существует. Аналогичен с атрибутом в EJB транзакции с таким же именем.
- NESTED – Выполняется в пределах вложенной транзакции, если текущая транзакция существует. В EJB нет аналога даному атрибуту.
В следующих постах мы детально рассмотрим принципы работы вышеперечисленых видов транзакций в Spring.
To be continued….
Sun выводит в свет Java 6 update 12
Более детальная информация о релизе – http://java.sun.com/javase/6/webnotes/6u12.html
Ссылка для скачивания – http://java.sun.com/javase/downloads/index.jsp
Первое дыхание Spring Framework 3.0 milestone
В предверии нового года SpringSource анонсировала Spring Framework 3.0 milestone. Главной фичей релиза стала поддержка REST. Более детальную информацию о релизе можно получить на официальном тим блоге проекта.
Sun выводит в свет Java 6 update 11
Одновременно с анонсированием JavaFX, Sun в догонку выводит в свет Java 6 update 11.
Более детальная информация о релизе – http://java.sun.com/javase/6/webnotes/6u11.html
Ссылка для скачивания – http://java.sun.com/javase/downloads/index.jsp

