Сегодня 19 декабря, четверг ГлавнаяНовостиО проектеЛичный кабинетПомощьКонтакты Сделать стартовойКарта сайтаНаписать администрации
Поиск по сайту
 
Ваше мнение
Какой рейтинг вас больше интересует?
 
 
 
 
 
Проголосовало: 7277
Кнопка
BlogRider.ru - Каталог блогов Рунета
получить код
Java to fun
Java to fun
Голосов: 0
Адрес блога: http://java2fun.blogspot.com/
Добавлен: 2013-11-08 19:59:15
 

Java Collections

2013-11-08 19:01:00 (читать в оригинале)

В Java для упрощения работы с большими объемами динамических данных были созданы collections. К основным реализациям относят List, Set и Queue. Начнем разбираться что для чего нужно и как их применять.


List, Set и Queue расширяют интерфейс Collection, который в свою очередь расширяет интерфейс Iterable. Это основные, но не все реализации 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.

Давайте рассмотрим, зачем нужен каждый. 

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 - для хранения не повторяющихся элементов.



Abstract class vs. Interface

2013-11-06 23:45:00 (читать в оригинале)

Долго меня мучил вопрос чем же все таки отличаются abstract class и interface в java.

Если посмотреть на определение то abstract class это базовый класс, который не предполагает создания экземпляров. А Interface это описание предполагаемого поведения класса, не упоминая конкретных действий. Другими словами интерфейс предполагает только объявление методов и полей для реализующего данный интерфейс класса.
Пример интерфейса A:
public interface IContent {
public void getUser();
public void getValue();
}
В интерфейсе все поля и методы должны быть публичными (public). В данном примере мы создали интерфейс Content и указали два метода: getUser и getValue.

Теперь нам нужно создать несколько классов, которые реализуют данный интерфейс. Так как просто контента быть не может, а может быть статья, коментарий, файл на скачку ролик, поэтому нам их надо реализовать.
public class Post implements IContent{
@Override
public void getUser()
// тут его реализация
}
@Override
public void getValue()
// тут его реализация
}
}
...

public class Video implements IContent{
@Override
public void getUser()
// тут его реализация
}
@Override
public void getValue()
// тут его реализация
}
}
И так далее. Вполне нормально, но метод getUser() для всех одинаков. Поэтому не самое лучшее решение в каждом классе его реализовывать. Поэтому нам лучше сделать так:
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 и всем что с ней связанно. Есть много различных интересных решение и технологий использующих данный язык программирования.

Но в большинстве своем они разрозненны и не систематизированы.

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

Здесь будут как уроки, так и новости. Возможно переводы других статей а также их компиляции.

Делитесь своими мыслями и пожеланиями.


 


Самый-самый блог
Блогер ЖЖ все стерпит
ЖЖ все стерпит
по количеству голосов (152) в категории «Истории»


Загрузка...Загрузка...
BlogRider.ru не имеет отношения к публикуемым в записях блогов материалам. Все записи
взяты из открытых общедоступных источников и являются собственностью их авторов.