Класная статья, читать всем http://www.pvsm.ru/java/28001
среда, 13 марта 2013 г.
среда, 10 октября 2012 г.
Java Collection Framework - part 2
Ниже приведен короткий список реализаций мап из пакета java.util. Выбрав наиболее подходящую реализацию не забывайте обратится к Java API заболее детальной информацией.
Интерфейсы:
- Map - структура данных типа ключь-значение, где ключи не могут содержать дубликатов. Мапы не отслеживают изменение полей объектов которые в них содержатся!
Этот интерфес содержит методы:
- добавления/удаления новых значений в мапу
- проверки присутствия елемента или ключа в мапе
- возвращения сета ключей или пар ключь-значение, а также колекции значений. При этом последние возвращаются по ссылке, т.е. любое изменение в мепе отразится в сетах/колекциях которые были получены и наоборот.
- synchronizedMap, synchronizedSortedMap - синхронизирует все методы (реализуя паттерн Decorator)
- unmodifiableMap, unmodifiableSortedMap - возвращает колекцию при попытке модификации которой будет брошено исключение UnsupportedOperationException(реализация - паттерн Decorator)
- checkedMap, checkedSortedMap - возвращает колекцию гарантированно содержащую заданый тип. При попытке вставить елемент другого типа будет брошено исключение ClassCastException(реализация - паттерн Decorator)
- SortedMap - Map которая гарантирует сохранение ключей в отсортированом виде.
Содержит методы:
- для получения мин/max значения - firstKey/lastKey
- для получения мап с ключами меньше/больше заданого ключа - headMap/tailMap
- для получения мап с значениями в диапазоне между двумя ключами - subMap
- NavigableMap - SortedMap оптимизированая для поиска по условиям сравнения.
Cвойства:
- содержит оптимизированые методы для получения ключей и их значений по условиям: <, <=,>, >=
- методы NavigableMap параметризированы для включения/не включения граничных условий
- Эти методы возвращаеют наборы ключей, значений, или мапу отсортированую в обратном порядке
- ConcurrentMap - мапа предоставляющая atomic операции putIfAbsent, remove, replaсe. Возвращают true - если операция изменила данные, иначе false
- ConcurentNavigableMap -расширяет NavigableMap возвращая результатом операций тип ConcurentNavigableMap вместо NavigableMap
Классы:
- HashMap - мапа ключи которой размещаются в бакетах, согласно значению их hashcode.
Cвойства:
- методы не синхронизированы
- может содержать нули
- сложность операций извлечения/вставки (get/put/containsKey) - O(1)
- сложность операции containsValue - O(capacity +size)
- При итерировании порядок не гарантирован.
- Сложность итерирования: O(capacity +size), где capacity - количество бакетов, size -размер мапыv
- перестраивает хеши автоматически если: size > loadFactor* capacity. По умолчанию loadFactor = 0.75, capacity=16. При этом capacity увеличивается в двое.
- LinkedHashMap - HashMap ключи которой связаны в LinkedList, это гарантирует порядок обхода ключей (в порядке добавления(insertion-order) или в порядке получения доступа(access-order).
- свойства insertion-order - это дефолтный режим, если существующий ключ вставляется второй раз - порядок в LinkedList не изменится.
- свойства access-order - включается специальным параметром в конструкторе, любая операция put или get изменяет порядок листа
- cложность операции containsValue и итерирования: O(size)!
- Остальные свойства аналогичны HashMap.
- Hashtable - старая потокобезопасная реализация HashMap. Болееновая реализация - ConcurentHashMap. Аналогичен HashMap за исключением:
- не может содержать нулей
- все методы синхронизированы
- Properties - представляет набор пропертейю обладает всеми свойствами Hashtable плюс:
- все ключи типа String
- содержит методы чтения/записи в поток
- для каждого ключа может содержатся 2 значения: обычное и значение по умолчанию, которое задается на конструкторе.
- TreeMap - реализация Red-Black treе -самобалансирующиеся BST
Свойства:
- сложность вставки, удаления, получения, проверки вхождения - O(log(n))
- методы не синхронизированы
- ConcurrentHashMap - более новая реализация Hashtable. Методы имеют туже сигнатуру, поэтому можно просто заменить Hashtable на ConcurentHashMap.
Cвойства:
- все операции потокобезопасны
- операции извлечения данных не блокируют потоки выполнения, и возвращают согласованные данные (относительно завершившихся операций по изменению данных)
- операции по изменению данных блокируют только часть таблицы (грубо говоря нельзя одновременно писать в один бакет, но можно в разные)
- операции по изменнению набора данных типа putAll, clear будут в течении своей работы блокировать определенные сегменты но не всю таблицу
- Операции для работы с набором данных putAll, clear не атомарны!
- Один из параметров конструктора concurrencyLevel - число одновременно работающих потоков, таблица будет разбита на соответствующее число бакетов. (По умолчанию - 16)
- ConcurrentSkipListMap - потокобезопасная реализация SkipList.
- Сложность операций contains, get, put, remove - O(log(n))
- Сложность операции size - O(n)!!!
- Операции для работы с набором данных putAll, equals, и clear не атомарны!
- EnumMap - мапа ключами которой могут быть только занчения Enum.
Свойства:
- Данные сохранняются в масивах, длина которого совпадает с количеством Enum.
- ключи отсортированы в порядке возростания.
- сложность операций извлечения/вставки (get/put/containsKey) - O(1)
- сложность операции containsValue - O(Enum.size())
- IdentityHashMap - хеш мапа с хитрым свойством: Ключи равны тогда и только тогда когда равны их ссылки (key1 == key2) Остальные свойства аналогичны обычной HashMap. Используется если вам нужно по какойто причине иметь список обектов, например при сериализации - когда хотите знать какие объекты уже сериализированы, или при отладке - если хотите иметь список объектов для которых включен дебаг и т.д.
- WeakHashMap - Хеш мапа, в которой значения ключей не содержатся на прямую, а сохраняются как WeakReference. Иначе говоря, сборщик мусора может собирать ключи (если на них отсутствуют ссылки из других мест). Значения привязаные к таким собранным ключам будут удалятся из мапы автоматически. Внимание: значения сохраняются в Мапе как обычные ссылки
понедельник, 2 апреля 2012 г.
Java Collection Framework - part 1
Огромное количество классов для работы с колекциями в Java, может пугать. Но за ними кроются конкретные реализации алгоритмов, применение которых сделают ваши програмы более читабельными, быстрими и стабильными. Ниже представлена краткая и агрегированая информация по интерфейсах и классах. Выбрав нужный не забудте посмотреть подробности в Java API.
Интерфейсы:
-
Collection: - описывает группу объектов (элементов). Определяет методы для получения итератора, добавления, удаления элементов, проверки на вхождение элемента в даную колекцию, преобразования колекции к масиву.
При помощи утилитного класса java.util.Collections вы можете произвести такие действия над вашей колекцией:- synchronizedCollection - синхронизирует все методы (реализуя паттерн Decorator)
- unmodifiableCollection - возвращает колекцию при попытке модификации которой будет брошено исключение UnsupportedOperationException(реализация - паттерн Decorator)
- checkedCollection - возвращает колекцию гарантированно содержащую заданый тип. При попытке вставить елемент другого типа будет брошено исключение ClassCastException(реализация - паттерн Decorator)
- List: - список - упорядоченная последовательность объектов.
Елементы упорядоченны - имеют свои индексы. Интерфейс описывает методы для добавления, замещения, удаления елементов по индексу. Также методы для получения индекса елемента и ListIterator - который кроме елементов может возвращать их индексы. Класс java.util.Collections кроме операций аналогичных операциям с колекцией описывает также операции:
Поиска и сортировки- sort - стабильная сортировка модифицированым методом mergesort, сложность O(n log(n)))
- binarySearch - поиск елемента в отсортированой колекции. Сложность для RandomAcсess листов O(log n), иначе O(n)
- copy - копирует все елементы в доругой список
- fill - заполняет лист одним и тем же елементом
- indexOfSubList, lastIndexOfSubList - возвращает первый (последний) индекс вхождения одного списка в другой, или же -1, Использует "brute force" стратегию :)
- shuffle - рандомно перемешывает список, сложность O(n)
- swap - меняет два елемента списка местами
- reverse - разворачивает список, сложность O(n)
- rotate - сдвигает елементы списка, сложность O(n)
-
Queue: - очередь в которой елементы выстроены по принципу FIFO (first-in-first-out).
Определяет методы добавления в конец очереди и извлечения первого елемента из очереди(offer(e), poll()). Также есть метод peek() - получить первый елемент в очереди без его удаления.
Класс java.util.Collections определяет операции аналогичные операциям с колекциями. -
Deque: - двунаправленная очередь, добавлять и извлекать елементы которой можно как с конца, так и сначала. Используется для реализации стратегий как LIFO(Stack), так и FIFO.
Кроме методов Queue определяет методы для работы со стеком: push(e), pop() - добавление в начало и извлечение первого елемента, peek() - возвратит первый елемент без его удаления. Также есть метод для получения обратного итератора: descendingIterator()
Вы можете преобразовать Deque в Queue при помощи java.util.Collections (реализация - паттерн Decorator). -
BlockingQueue: - блокирующая очередь для передачи данных между потоками.
Читающий поток будет остановлен пока не появится хотя бы одна запись в очереди. Пишущий поток будет остановлен если превышен предел елементов в очереди. если же елементов станет меньше он продолжит свою работу.
remainingCapacity - возвращает число свободных слотов Существует 4 набора методов для вставки и получения елементов:- add(e), element(), remove() - добавить, достать, удалить, при запрете операции в данный момент (отсутствии елементов, или заполнености очереди) бросается исключение IllegalStateException
- offer(e), poll() - добавить/извлечть елемент, без блокировки потока, при запрете операции будет возвращен результат false или null
- offer(e, time, unit), poll(time, unit) - добавить/извлечь елемент, c блокировкой не дольше заданого интервала
- put(e), take() - добавить/извлечть елемент c блокировкой потока до выполнения операции
- drainTo(Collection) - извлечь все елементы из очереди и поместить в колекцию
-
BlockingDeque: - блокирующая двунаправленная очередь, для передачи данных между потоками.
Аналогична BlockingQueue но позволяет добавлять и извлекать елементы с обоих концов.
Методы имеют приставки к именам First - означает начало и Last - хвост очереди.
Также есть методы removeFirstOccurrence(e)/removeLastOccurrence(e) - удаляющие первое или последнее вхождение данного елемента.
Классы:
-
ArrayList: - представляет масив длинна которого меняется автоматически (динамический масив)
Сойства:- методы не синхронизированы (нельзя использовать в нескольких потоках)
- сложность операций size, isEmpty, get, set, iterator, listIterator, add - O(1)
- add - работает медленнее чем в LinkedList
- Если был получен iterator или listIterator, а затем была изменена структура списка, будет брошен ConcurrentModificationException. Но это поведение не гарантируется при изменении структуры несколькими потоками
-
Vector: - представляет масив длинну которого можно увеличивать
Сойства:- методы синхронизированы (безопасно использовать в нескольких потоках, но меньшая производительность при работе с одним)
- setSize - устанавливает новый размер масива
- add(int index,E element) добавляет елемент в определенную позицию, или же бросает ArrayIndexOutOfBoundsException
- Не рекомендуется завязывать логику программы на ConcurrentModificationException, несмотря на синхронизированость методов. Это исключение призвано только для выявления багов
-
Stack: - представляет старую реализацию стекаLIFO
Сойства:- К методам Vector добавляет push(e), pop()
- методы синхронизированы
- Более согласованую абстракцию LIFO представляет интерфейс Deque и его реализация ArrayDeque
-
CopyOnWriteArrayList: - потоко-безопасный вариант ArrayList
Сойства:- Все операции изменяющие структуру применяются к новой копии существующего масива данных. Для быстрого копирования используется нейтивные системные функции. Тоесть если один поток хочет читать масив - он получает снимок текущего масива и дальше читает его (возможно устаревшие данные), а другой в это время, может без боязненно его изменять.
- Операции связанные с изменением структуры синхронизированны. Тоесть в любой момент временни только один поток может изменять структуру
- Операции связанные с чтением не блокируют запись
- Вы не сможете изменять структуру данного листа через итератор (так как итератор работает с более старым снимком данных). Операции итератора remove, set, add будут бросать UnsupportedOperationException
-
LinkedList: - Связаный список (двусвязный список)
Сойства:- Методы не синхронизированы (нельзя использовать в нескольких потоках)
- Сложность операций get, isEmpty, remove, insert - в конец и начало списка одинакова (O(1))
- Сложность операций get(index) - O(n)
- Если был получен iterator или listIterator, а затем была изменена структура списка, будет брошен ConcurrentModificationException. Но это поведение не гарантируется при изменении структуры несколькими потоками
-
PriorityQueue: - бесконечная очередь на базе структуры heap
Сойства:- Методы не синхронизированы (нельзя использовать в нескольких потоках), многопоточная реализация PriorityBlockingQueue
- Сложность операций получения елемнетовpeek, element, size - O(1)
- Сложность операций вставки и извлеченияoffer, poll, remove(), add - O(log(n)
- Сложность операций доступа к конкретному елементу remove(Object), contains(Object) - O(n)
- iterator() - обходит очередь в произвольном порядке
- Для обхода кучи в порядке убывания/возростания елементов используйте конструкцию Arrays.sort(pq.toArray()) - сложность O(n*log(n))
-
ConcurrentLinkedQueue: - бесконечная очередь потокобезопасная очередь
Элементы хранятся в отдельных объектах (нодах), которые связываются посредством ссылок. Изменения структуры отслеживаются через AtomicReferenceFieldUpdater класс. Сойства:- Методы не синхронизированы, но структура этой очереди позволяет множеству потоков работать с одной и той же очередью безопасно
- Сложность операции size - O(n)!
-
ArrayDeque: - реализация двусвязной очереди на базе динамического масива
Сойства:- Методы не синхронизированы (нельзя использовать в нескольких потоках)
- Сложность операций добавления и извлечения елементов в оба конца очереди - O(1)
- Сложность операций для работы с конкретным елементом remove(Object), contains, iterator.remove() - O(n)
- Если был получен iterator или descendingIterator, а затем была изменена структура очереди, будет брошен ConcurrentModificationException. Но это поведение не гарантируется при изменении структуры несколькими потоками
-
ArrayBlockingQueue: - блокирующая очередь на базе масива постоянной длинны
Описывает класический буффер ограниченой длинны для обмена данными между потоками.
Сойства:- После создания нельзя изменить размер буффера
-
LinkedBlockingQueue: - Блокирующая очередь на базе связаного списка
Элементы хранятся в отдельных объектах (нодах), которые связываются посредством ссылок. Описывает буффер произвольной длинны для обмена данными между потоками. Сойства:- При создании можно задать размер буфера, по умолчанию он неограничен. После создания изменять размер буффера нельзя
- Очередь не ограничена, но можно нарватся на OutOfMemoryError
- Сложность добавления, извлечения елементов O(1) (не считая затраты на блокирову)
- Сложность изменения, получения конкретного елемента O(n) (не считая затраты на блокирову)
-
PriorityBlockingQueue: - блокирующай вариант PriorityQueue
Сойства:- При создании можно задать размер буфера, по умолчанию он неограничен. После создания изменять размер буффера нельзя
- Очередь не ограничена, но можно нарватся на OutOfMemoryError
-
SynchronousQueue: - блокирующая очередь, для синхронизации двух потоков.
Аналог ArrayBlockingQueue с размером буфера 1. -
DelayQueue: - неограниченая очередь, елементы которой стают доступны другому потоку только по истечении заданого времени.
Сойства:- Каждому елементу задается свое время после которого он станет доступен, для чтения в очереди
- size() - возвращает общее число как доступных так и не доступных елементов
- Очередь не ограничена, но можно нарватся на OutOfMemoryError
-
LinkedBlockingDeque: - Блокирующая двунаправленная очередь на базе связаного списка
Элементы хранятся в отдельных объектах (нодах), которые связываются посредством ссылок. Описывает буффер произвольной длинны для обмена данными между потоками. Сойства:- При создании можно задать размер буфера, по умолчанию он неограничен. После создания изменять размер буффера нельзя
- Очередь не ограничена, но можно нарватся на OutOfMemoryError
- Сложность добавления, извлечения елементов с обоих концов очереди O(1) (не считая затраты на блокирову)
- Сложность изменения, получения конкретного елемента (remove(Object), contains(Object), iterator.remove()) O(n) (не считая затраты на блокирову)
среда, 9 ноября 2011 г.
PostgreSQL. How Disable All Constraints
Sometimes shit happens.
In my situation it was two plain-text SQL files. One of them contains DB schema and second with data.
I successfully create new DB and create DB schema using command:
pg_restore didn’t want to read this format and psql didn’t want insert data because constraints were already turn on.
I did not find correct way for turn off all constraints in PosgressSQL. I found information about how disable triggers for specific table but not for all:
http://www.postgresql.org/docs/8.1/static/sql-altertable.html
After some experiments I found the next way which works for PostgreSQL v8.3.3:
Disable all triggers(run this sql command):
In my situation it was two plain-text SQL files. One of them contains DB schema and second with data.
I successfully create new DB and create DB schema using command:
psql -U my_user my_db < db_schema.sql
but the next steps gave many errors.pg_restore didn’t want to read this format and psql didn’t want insert data because constraints were already turn on.
I did not find correct way for turn off all constraints in PosgressSQL. I found information about how disable triggers for specific table but not for all:
http://www.postgresql.org/docs/8.1/static/sql-altertable.html
After some experiments I found the next way which works for PostgreSQL v8.3.3:
Disable all triggers(run this sql command):
update pg_trigger set tgenabled='D' ;
Insert data:psql -U my_user my_db < db_data.sql
Enable all triggers:update pg_trigger set tgenabled='O' ;
четверг, 3 ноября 2011 г.
Using log4j into jboss
Good article about using log4j into jboss
http://www.mastertheboss.com/jboss-application-server/251-jboss-log4j-configuration.html?showall=1
http://www.mastertheboss.com/jboss-application-server/251-jboss-log4j-configuration.html?showall=1
пятница, 7 октября 2011 г.
Using Hadoop
Good article about Hadoop using and testing
http://marcellodesales.wordpress.com/2010/01/05/hadoop-0-20-1-api-refactoring-the-invertedline-cloudera-trainin-removing-deprecated-classes-jobconf/
http://marcellodesales.wordpress.com/2010/01/05/hadoop-0-20-1-api-refactoring-the-invertedline-cloudera-trainin-removing-deprecated-classes-jobconf/
среда, 13 октября 2010 г.
jMagick installation
First step - install ImageMagick :
For installation download file from for your OS and simple run it.
(for Unbuntu OS run command: apt-get install imagemagick --fix-missing)
Second step - install jMagick :
For installation download files from and follow by instructions
(for Unbuntu OS run command: sudo apt-get install jmagick --fix-missing)
Make sure that jmagick binary files (jmagick*.so or jmagick*.dll for windows os) are accessible for jvm. This files mast be present in /usr/lib for linux os or in java_home/bin folders. If this files are absent simple copy it from jmagick installation package.
For installation download file from for your OS and simple run it.
(for Unbuntu OS run command: apt-get install imagemagick --fix-missing)
Second step - install jMagick :
For installation download files from and follow by instructions
(for Unbuntu OS run command: sudo apt-get install jmagick --fix-missing)
Make sure that jmagick binary files (jmagick*.so or jmagick*.dll for windows os) are accessible for jvm. This files mast be present in /usr/lib for linux os or in java_home/bin folders. If this files are absent simple copy it from jmagick installation package.
Подписаться на:
Сообщения (Atom)


