Какой рейтинг вас больше интересует?
|
Главная /
Каталог блоговCтраница блогера Java to fun/Записи в блоге |
Java Collections
2013-11-08 19:01:00 (читать в оригинале)В Java для упрощения работы с большими объемами динамических данных были созданы collections. К основным реализациям относят List, Set и Queue. Начнем разбираться что для чего нужно и как их применять.
List, Set и Queue расширяют интерфейс Collection, который в свою очередь расширяет интерфейс Iterable. Это основные, но не все реализации Collection. Их на самом тебе гораздо больше.
Давайте рассмотрим, зачем нужен каждый.
List - Представляет собой неупорядоченную коллекцию, в которой допустимы дублирующие значения. Иногда их называют последовательностями. Элементы такой коллекции пронумерованы, начиная от нуля, к ним можно обратиться по индексу.
Set - описывает неупорядоченную коллекцию, не содержащую повторяющихся элементов. Это соответствует математическому понятию множества (set).
Queue - это коллекция, предназначенная для хранения элементов в порядке, нужном для их обработки. В дополнение к базовым операциям интерфейса Collection, очередь предоставляет дополнительные операции вставки, получения и контроля.
Теперь перейдем к более детальной реализации каждой коллекции, рассмотрим только основные, наиболее распространенные реализации:
List
ArrayList - пожалуй самая часто используемая коллекция. ArrayList инкапсулирует в себе обычный массив, длина которого автоматически увеличивается при добавлении новых элементов. Так как ArrayList использует массив, то время доступа к элементу по индексу минимально (В отличии от LinkedList). При удалении произвольного элемента из списка, все элементы находящиеся «правее» смещаются на одну ячейку влево, при этом реальный размер массива (его емкость, capacity) не изменяется. Если при добавлении элемента, оказывается, что массив полностью заполнен, будет создан новый массив размером (n * 3) / 2 + 1, в него будут помещены все элементы из старого массива + новый, добавляемый элемент.
LinkedList - двусвязный список. Это структура данных, состоящая из узлов, каждый из которых содержит как собственно данные, так и две ссылки на следующий и предыдущий узел списка. Доступ к произвольному элементу осуществляется за линейное время (но доступ к первому и последнему элементу списка всегда осуществляется за константное время — ссылки постоянно хранятся на первый и последний). В целом же, LinkedList в абсолютных величинах проигрывает ArrayList и по потребляемой памяти и по скорости выполнения операций.
Set
HashSet - коллекция, не позволяющая хранить одинаковые объекты(как и любой Set), инкапсулирует в себе объект HashMap (то-есть использует для хранения хэш-таблицу). Выгода от хеширования состоит в том, что оно обеспечивает константное время выполнения методов add(), contains(),remove() и size() , даже для больших наборов. Если Вы хотите использовать HashSet для хранения объектов своих классов, необходимо переопределить методы hashCode() и equals(), иначе два логически-одинаковых объекта будут считаться разными, так как при добавлении элемента в коллекцию будет вызываться метод hashCode() класса Object (который вернет разный хэш-код для ваших объектов). Важно отметить, что класс HashSet не гарантирует упорядоченности элементов, поскольку процесс хеширования сам по себе обычно не порождает сортированных наборов.
Если вам нужны сортированные наборы, то лучшим выбором может быть другой тип коллекций, такой как класс TreeSet.
LinkedHashSet - поддерживает связный список элементов набора в том порядке, в котором они вставлялись. Это позволяет организовать упорядоченную итерацию вставки в набор. То есть, когда идет перебор объекта класса LinkedHashSet с применением итератора, элементы извлекаются в том порядке, в каком они были добавлены.
TreeSet - коллекция, которая хранит свои элементы в виде упорядоченного по значениям дерева. TreeSet инкапсулирует в себе TreeMap, который в свою очередь использует сбалансированное бинарное красно-черное дерево для хранения элементов. TreeSet хорош тем, что для операций add, remove и contains потребуется гарантированное время log(n).
Queue
PriorityQueue - это очередь с упорядочиванием элементов либо по их натуральному порядку (используя интерфейс Comparable), либо с помощью интерфейса Comparator, полученному в конструкторе.
Устаревшие коллекции, их использование не рекомендуется, но не запрещается: 1. Enumeration — аналог интерфейса Iterator. 2. Vector — аналог класса ArrayList; поддерживает упорядоченный список элементов, хранимых во "внутреннем" массиве. 3. Stack — класс, производный от Vector, в который добавлены методы вталкивания (push) и выталкивания (pop) элементов, так что список может трактоваться в терминах, принятых для описания структуры данных стека (stack). 4. Dictionary — аналог интерфейса Map, хотя представляет собой абстрактный класс, а не интерфейс. 5. Hashtable — аналог HashMap. Все методы Hashtable, Stack, Vector являются синхронизированными, что делает их менее эффективными в одно поточных приложениях.
Так же многие говоря о Collection некоторые подразумевают, что и Map тоже реализует данный интерфейс. Но на самом деле это не так. Map сам является интерфейсов верхнего уровня. Тем самым Map не является Collection.
Выводы:
1. ArrayList - если необходимо хранить большое количество элементов с постоянным чтением и добавлением повторяющихся элементов.
2. LinkedList - если чтение и добавление происходят в основном в начале или конце списка.
3. Set - для хранения не повторяющихся элементов.
List, Set и Queue расширяют интерфейс Collection
Для справки:
Классы наследующие Collection - AbstractCollection, AbstractList, AbstractQueue, AbstractSequentialList, AbstractSet, ArrayBlockingQueue, ArrayDeque, ArrayList, AttributeList, BeanContextServicesSupport, BeanContextSupport, ConcurrentLinkedDeque, ConcurrentLinkedQueue, ConcurrentSkipListSet, CopyOnWriteArrayList, CopyOnWriteArraySet, DelayQueue,EnumSet, HashSet, JobStateReasons, LinkedBlockingDeque, LinkedBlockingQueue, LinkedHashSet, LinkedList, LinkedTransferQueue, PriorityBlockingQueue, PriorityQueue, RoleList, RoleUnresolvedList, Stack, SynchronousQueue, TreeSet, Vector.
1. ArrayList - если необходимо хранить большое количество элементов с постоянным чтением и добавлением повторяющихся элементов.
2. LinkedList - если чтение и добавление происходят в основном в начале или конце списка.
3. Set - для хранения не повторяющихся элементов.
Тэги: arraylist, collections, hashset, java, linkedhashset, linkedlist, list, priorityqueue, queue, set, treeset
Постоянная ссылка
Abstract class vs. Interface
2013-11-06 23:45:00 (читать в оригинале) Долго меня мучил вопрос чем же все таки отличаются abstract class и interface в java.
Если посмотреть на определение то abstract class это базовый класс, который не предполагает создания экземпляров. А Interface это описание предполагаемого поведения класса, не упоминая конкретных действий. Другими словами интерфейс предполагает только объявление методов и полей для реализующего данный интерфейс класса.
Пример интерфейса A:
Теперь нам нужно создать несколько классов, которые реализуют данный интерфейс. Так как просто контента быть не может, а может быть статья, коментарий, файл на скачку ролик, поэтому нам их надо реализовать.
В абстрактном классе AContent мы полностью реализовали получение user. Метод получения user есть и в видео и в статье. А вот метод получения значения в абстрактном классе не определен, а только объявлен, поэтому их надо переопределить и реализовать в наследниках.
Вывод:
1. если есть для классов нет одинаковых методов в плане реализации, а есть только одинаковые методы в плане объявления, то лучше использовать Interface.
2. Если есть сущность действительно абстрактная и в ней можно реализовать методы для наследников, то лучше использовать abstract class.
3. Если ничего из выше перечисленного нет, то нужно сделать родительский класс от которого будите наследоваться.
Если посмотреть на определение то abstract class это базовый класс, который не предполагает создания экземпляров. А Interface это описание предполагаемого поведения класса, не упоминая конкретных действий. Другими словами интерфейс предполагает только объявление методов и полей для реализующего данный интерфейс класса.
Пример интерфейса A:
public interface IContent {В интерфейсе все поля и методы должны быть публичными (public). В данном примере мы создали интерфейс Content и указали два метода: getUser и getValue.
public void getUser();
public void getValue();
}
Теперь нам нужно создать несколько классов, которые реализуют данный интерфейс. Так как просто контента быть не может, а может быть статья, коментарий, файл на скачку ролик, поэтому нам их надо реализовать.
public class Post implements IContent{И так далее. Вполне нормально, но метод getUser() для всех одинаков. Поэтому не самое лучшее решение в каждом классе его реализовывать. Поэтому нам лучше сделать так:
@Override
public void getUser()
// тут его реализация
}
@Override
public void getValue()
// тут его реализация
}
}
...
public class Video implements IContent{
@Override
public void getUser()
// тут его реализация
}
@Override
public void getValue()
// тут его реализация
}
}
public abstract class AContent {
private String user;
public String getUser(){
return user;
}
public abstract String getValue();
}
public class Post extends extends AContent{
public Post(){
// тут конструктор
}
@Override
public void getValue()
// тут его реализация
}
}
...
public class Video extends AContent{
public Video(){
// тут конструктор
}
@Override
public void getValue()
// тут его реализация
}
}
В абстрактном классе AContent мы полностью реализовали получение user. Метод получения user есть и в видео и в статье. А вот метод получения значения в абстрактном классе не определен, а только объявлен, поэтому их надо переопределить и реализовать в наследниках.
Аспект | abstract class | interface |
---|---|---|
Назначение | Как любой базовый класс, представляет ядро поведения для всех наследников. Если в абстрактном классе не реализован ни один метод, имеет смысл превратить его в интерфейс. | Контракт, ничего более. Интерфейсы часто используются (и во основном предназначены для этого) как примеси без реализации при проектировании иерархии классов. |
Реализация по умолчанию | Может быть частично или полностью реализован, предоставлять базовую функциональность. | Не может содержать какой-либо код. |
Модификаторы доступа членов | Члены могут иметь все допустимые модификаторы доступа. | Только public. |
Наследование | Наследование от абстрактного класса реализует отношение "является". | Наследование от интерфейса определяет отношение "реализует". |
Множественное наследование | Класс может наследовать только один класс. | Класс может наследовать несколько интерфейсов. При этом он может и не реализовывать методы интерфейса, т. е. быть абстрактным. Сам интерфейс тоже может наследовать несколько интерфейсов. |
Расширение | При добавлении нового метода в абстрактный класс, мы можешь реализовать его, тем самым не нарушив работу наследующих классов. Если тело метода оставить нереализованным, потребуется его реализация в классах-наследниках с последующей перекомпиляцией. | При добавлении нового метода в интерфейс мы должны определить его во всех классах, реализующих интерфейс, с перекомпиляцией. |
Члены | Может содержать все допустимые члены. | Только методы, свойства |
Вывод:
1. если есть для классов нет одинаковых методов в плане реализации, а есть только одинаковые методы в плане объявления, то лучше использовать Interface.
2. Если есть сущность действительно абстрактная и в ней можно реализовать методы для наследников, то лучше использовать abstract class.
3. Если ничего из выше перечисленного нет, то нужно сделать родительский класс от которого будите наследоваться.
Начало
2013-11-06 10:28:00 (читать в оригинале)Начало...
Данный блог будет только о java и всем что с ней связанно. Есть много различных интересных решение и технологий использующих данный язык программирования.
Но в большинстве своем они разрозненны и не систематизированы.
Не для кого не секрет что описывая что-либо начинаешь больше разбираться в этом, даже если ты не думал что можно узнать что-то еще. Формулирование мыслей систематизирует знания больше чем простое заучивание.
Здесь будут как уроки, так и новости. Возможно переводы других статей а также их компиляции.
Делитесь своими мыслями и пожеланиями.
Категория «Субкультуры»
Взлеты Топ 5
+221 |
238 |
Yurenzo |
+213 |
249 |
Идеи подарков. Что и где купить, как сделать своими руками. Инте |
+198 |
211 |
Ein_Brennende_Komet |
+185 |
208 |
Russian parkour |
+139 |
216 |
Портал роллеров Roller-style.ru: Новости |
Падения Топ 5
-5 |
6 |
navesele |
-21 |
16 |
Субкультура Онлайн |
-182 |
3 |
mg5 |
|
|
|
|
|
|
Популярные за сутки
Загрузка...
BlogRider.ru не имеет отношения к публикуемым в записях блогов материалам. Все записи
взяты из открытых общедоступных источников и являются собственностью их авторов.
взяты из открытых общедоступных источников и являются собственностью их авторов.