Основні переваги використання колекцій

Колекції у Java 2

Цей допис було зроблено Javaоснови і позначено Java в 14.03.2015 автором Akceptor.

· Не варто плутати Collection – інтерфейс-предок для Set та List і Collections – клас, у якому зібрано статичні методи для роботи з колекціями.

· Існує 4 групи колекцій: списки (List), набори (Set), мапи (Map) та черги (Queue). Варто зауважити, що не всі вони імплементують інтерфейс Collection (крім мап).

Цю ілюстрацію взято зі статті на хабрі (російською): http://habrahabr.ru/post/237043/

· Колекції бувають впорядковані та сортовані (ну і невпорядковані та несортовані). Ці терміни можуть здаватися подібними і заплутати. Впорядковані колекції це такі, при ітеруванні через які ми отримуємо елементи у певному порядку (можливо у порядку додавання елементів у колекцію, або навіть на перший погляд хаотично, та все ж певний порядок є). Сортовані колекції не просто зберігають елементи впорядковано, але й сортують їх за певними ознаками, скажімо за алфавітом. Можна також реалізувати власний порядок сортування.

· Списки є впорядкованими колекціями, які допускають дублювання елементів всередині. ArrayList являє собою динамічний масив, призначений для швидкого ітерування та доступу на читання. LinkedList має в основі двов’язний список (кожен елемент посилається на попередній і наступний), тому дозволяє швидко додати елементи в середину списку. Vector – синхронізована версія ArrayList. Stack – розширення вектора, яке реалізує стек (LIFO).

· Набори є колекціями, які не дозволяють дублювати елементи. HashSet – невпорядкована колекція, яка всередині має HashMap (використовуються тільки ключі хешмапи) і таким чином елементи з однаковим hashCode() вважатимуться ідентичними. LinkedHashSet – впорядкована за порядком додавання елементів колекція, базується на LinkedHashMap. TreeSet базується на NavigableMap і є сортованою колекцією, яка до того ж дозволяє задати власний порядок сортування за допомогою відповідного компаратора.

· Мапи зберігають дані у форматі ключ-значення і тому не допускають однакових ключів. Мапи не імплементують інтерфейс Collection, натомість вони імплементують інтерфейс Map. HashMap – найбільш часто вживана мапа, дозволяє використовувати null як у якості ключа, так і в якості значень. Hashtable (зверніть увагу на написання – не кемел-кейсом) – синхронізована версія HashMap, яка не дозволяє використовувати null (ні як ключ, ні як значення). LinkedHashMap – впорядкована версія хеш-мапи, порядок елементів визначається порядком їх додавання у колекцію (або порядком у якому раніше зверталися до елементів), дозволяються null у якості ключа та значень. TreeMap – сортована мапа, порядок сортування також можна задати за допомогою власного компаратора.

· Черги реалізують колекції з перевизначеним способом додавання та отримання елементів (FIFO), відповідно і сортуються елементи у порядку додавання у чергу. PriorityQueue – елементи впорядковані за пріоритетом, який може бути змінений за допомогою компаратора; не підтримує null у якості елемента.

· Інтерфейс Queue реалізує також така колекція як LinkedList.

· Починаючи з Java6 інтерфейс Queue було розширено інтерфейсом Deque, який дозволяє реалізувати стек (LIFO). Імплементацією цього інтерфейсу є ArrayDeque.

· Колекції можуть зберігати тільки об’єкти, проте підтримується автобоксинг примітивів у відповідні класи-обгортки, тому можна додавати до колекції скажімо int.

· Існує два способи ітерування (перебору елементів) колекцій: цикл for та використання ітератора.

· Ітератори мають методи next() та hasNext(). Перший з них повертає наступний елемент колекції та переходить до нього, другий – тільки повертає значення true якщо наступний елемент у колекції існує, але не пересуває сам ітератор.

Загальні відомості про контейнерні класи та інтерфейси

Засоби Java для роботи з колекціями надають уніфіковану архітектуру для представлення та управління наборами даних. Ця архітектура дозволяє працювати з колекціями незалежно від деталей їх внутрішньої організації. Засоби для роботи з колекціями включають більше десятка інтерфейсів, а також стандартні реалізації цих інтерфейсів і набір алгоритмів для роботи з ними.

Колекція – це об'єкт, який представляє групу об'єктів. Використання колекцій забезпечує підвищення ефективності програм завдяки використанню високоефективних алгоритмів, а також сприяє створенню коду, придатного для повторного використання. Основними елементами засобів роботи з колекціями є такі:

· інтерфейси

· стандартні реалізації інтерфейсів

· алгоритми

· утиліти для роботи з масивами

Крім того, Java 8 підтримує контейнери Java 1.1, що не забезпечують стандартизованого інтерфейсу, і внаслідок цього вважаються застарілими і не рекомендовані для використання. Це Vector, Enumeration, Stack, BitSet і деякі інші. Наприклад, клас Vector надає функціональність, аналогічну ArrayList. Зараз ці контейнери вважаються застарілими і не рекомендовані до застосування. Замість них слід використовувати відповідні узагальнені контейнери Java 5.

Стандартні контейнерні класи Java дозволяють зберігати колекції посилання на об'єкти, класи яких походять від класу Object. Контейнерні класи реалізовані в пакеті java.util. Починаючи з Java 5, усі контейнерні класи реалізовані як узагальнені.

Існує два базових інтерфейси, в яких декларована функціональність контейнерних класів: Collection і Map. Інтерфейс Collection є базовим для інтерфейсів List (список), Set (множина), Queue (черга) і Deque (черга з двома кінцями).

Інтерфейс List (список) описує пронумеровану колекцію (послідовність), елементи якої можуть повторюватися. Існує стандартна абстрактна реалізація списку – клас AbstractList. Цей клас, похідний від AbstractCollection, надає ряд корисних засобів. Практично в тій чи іншій формі реалізовані всі методи, крім get() і size(). Проте, для конкретної реалізації списку більшість функцій слід перекрити. В якості вкладеного розміщений клас, який реалізує інтерфейс Iterator. Клас AbstractList – базовий для ArrayList. Класс AbstractSequentialList, похідний від AbstractList, є базовим для класу LinkedList. Робота зі списками була розглянута раніше.

Інтерфейс Set реалізований класами HashSet і LinkedHashSet. Інтерфейс SortedSet, похідний від Set, реалізований класом TreeSet. Інтерфейс Map реалізований класом HashMap. Інтерфейс SortedMap, похідний від Map, реалізований класом TreeMap.

Класи HashSet, LinkedHashSet і HashMap використовують для для ідентифікації елементів так звані хеш-коди. Хеш-код – це унікальна послідовність бітів фіксованої довжини. Для кожного об'єкта ця послідовність вважається унікальною. Хеш-коди забезпечують швидкий доступ до даних по деякому ключу. Механізм одержання хеш-кодів забезпечує їх майже повну унікальність. Усі об'єкти Java можуть генерувати хеш-коди: метод hashCode() визначений для класу Object.

Для більшості колекцій існують як "звичайні" реалізації, так і реалізації, безпечні з точки зору потоків управління, наприклад CopyOnWriteArrayList, ArrayBlockingQueue тощо.

Основні переваги використання колекцій

· Знижує кількість написаного коду. Надаючи корисну структуру даних і алгоритмів, колекції звільняють від низькорівневого програмування і дозволяють зосередиться на інших частинах програми.

· Підвищує швидкодію і якість програми. Колекції забезпечують високу продуктивність, високу якість реалізації корисних структур даних і алгоритмів. Різні реалізації кожного інтерфейсу є взаємозамінними, так що програми можуть бути легко налаштовані на перемикання різних реалізацій колекцій.

· Дозволяє взаємодіяти не пов'язаним між собою API. Колекції загальновживані, тому можуть легко використовуватися в якості аргументів функцій та їх значень, що повертаються функціями.

· Зменшує кількість зусиль, прикладених для вивчення нових API. Багато API отримують колекції на вхід і віддають інші колекції на виході. У недавньому минулому кожне API мало свою власну реалізацію своїх колекцій. Через це доводилося вивчати структури даних, властиві кожному API.

· Зменшує кількість зусиль, прикладених для розробки нових API. Це зворотна сторона попередньої переваги. Програмістам немає необхідності створювати власні колекції, досить використовувати наявні або реалізувати свої на основі існуючих інтерфейсів.

Колекція в Java - це група індивідуальних елементів, часто з певними правилами, які застосовуються до елементів. Список повинен зберігати елементи в певній послідовності. Набір не може мати дубляж елементи. Карта - група об'єктних пар ключ-значення. Карта може повертати набір своїх ключових значень, колекцію своїх значень або набір своїх пар.

Приступаючи до розробки програми, далеко не завжди можна заздалегідь вирішити, які саме компоненти вам знадобляться. Зазвичай у розробника є лише загальне бачення того, що повинні робити компоненти, але реалізація функціональності компонентів з уточненням їх можливостей виконується пізніше, в ході роботи над проектом.

Частково цю проблему вирішує використання інтерфейсів, що описують подібні компоненти. Застосування інтерфейсів ускладнює роботу програміста, так як з інтерфейсу не вдається створити об'єкт. Для того щоб отримати об'єкт, потрібно реалізувати клас. Тому, замість того, щоб розробляти реалізацію такого класу, специфічного для конкретного додатка, можна просто вичленувати з класу функціональність конструктора і реалізувати її у вигляді спеціального методу "фабрикующего" об'єкти програми.

Коллекции в Java: что это такое и зачем они нужныОпубликовано в 04.06.2016

В пакете java.util содержится библиотека коллекций(collection framework), которая предоставляет большие возможности для работы с множествами, хэш-таблицами, векторами, разными видами списков и т.д.

Коллекция — это объект, способный хранить группу одинаковых элементов. Она содержит методы для операций с однородными данными. Изначально Java поддерживала работу с коллекциями в рамках классов Vector и Hashtable, но с появлением JDK 1.2 возможности работы с коллекциями были расширены, возникло много открытых интерфейсов и различных видов классов, которые были включены в библиотеку коллекций.

Основные преимущества классов collection framework(перед классами, разрабатываемыми самостоятельно) заключаются в следующем:

· ускоряется процесс разработки и улучшается качество кода;

· обеспечивается поддержка повторного использования кода;

· производится стандартизация интерфейса ваших классов;

· реализуется поддержка многопоточного доступа.

Основу библиотеки составляют открытые интерфейсы, которые можно использовать для создания собственных коллекций. Каждый интерфейс объявляет набор методов, которые вы обязаны реализовать в своей программе:

· Collection — группа элементов(охватывает Set и List);

· Set — множество элементов(без дублирования);

· SortedSet — то же самое, что Set, только элементы упорядочены;

· List — упорядоченный список;

· Map — словарь, то есть коллекция, в которой каждый элемент имеет уникальный ключ;

· SortedMap — то же самое, что и Map, однако элементы упорядочены;

· Queue — интерфейс для работы с очередью.

Разумеется, интерфейсы были бы «пустыми», если бы в них не существовало встроенных классов, реализующих необходимые функций:

· ArrayList — список List как массив элементов;

· LinkedList — список List, выполняющий функции связанного списка;

· HashSet — множество Set как хэш-таблица;

· TreeSet — множество SortedSet, используемое как дерево;

· HashMap — индексированный словарь хэш;

· TreeMap — коллекция SortedMap древовидной структуры.

Задача каждого из интерфейсов — обеспечить простоту и удобство работы с большим количеством однотипных данных. Рассмотрим подробнее назначение каждого из этих интерфейсов.

· Collection — общий интерфейс, объединяющий интерфейсы Set и List. Содержит методы для добавления и удаления элементов коллекции, проверки их правильности, наличия и другие.

· Set — неупорядоченный набор неповторяющихся элементов. Расширяет интерфейс Collection. Если производится попытка добавить в набор элемент, который уже в нем содержится, она будет проигнорирована.

· List — служит для работы с упорядоченными коллекциями. К каждому элементы такой коллекции можно обратиться по индексу. Расширяет интерфейс Collection.

· Map — предназначен для работы с коллекциями-словарями, в которых содержатся ключи и соответствующие им значения(каждому ключу соответствует только одно значением). Словарь может содержать произвольное число элементов.

· Queue — содержит методы для работы с очередями: в них элементы добавляются с одного конца, а извлекаются с другого.

Интересное видео для наших читателей:

Коллекции объектов Java.

Подробное знакомство со стандартной библиотекой Java мы начнем с коллекций объектов . Они реализованы различными классами пакета java.util. Мы рассмотрим не весь этот пакет, а только классы, связанные с коллекциями, что, однако, составляет значительную его часть.

Что такое коллекции объектов. Это очень мощный и исключительно полезный механизм. Простейшей коллекцией является массив. Но массив имеет ряд недостатков. Один из самых существенных - размер массива фиксируется до начала его использования. Т.е. мы должны заранее знать или подсчитать, сколько нам потребуется элементов коллекции до начала работы с ней. Зачастую это неудобно, а в некоторых случаях — невозможно.

Поэтому все современные базовые библиотеки различных языков программирования имеют тот или иной вариант поддержки коллекций объектов. Коллекции обладают одним важным свойством — их размер не ограничен. Выделение необходимых для коллекции ресурсов спрятано внутри соответствующего класса. Работа с коллекциями облегчает и упрощает разработку приложений. Отсутствие же подобного механизма в составе средств разработки вызывает серьезные проблемы, которые приводят либо к различным ограничениям в реализации либо к самостоятельной разработке адекватных средств для хранения и обработки массивов информации заранее неопределенного размера.

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

Начнем изучение коллекций в Java с примера.

Пример

Одним из широко используемых классов коллекций является ArrayList. Пример использования этой коллекции приводится ниже.

import java.util.*;

import java.io.*;

 

publicclassArrayListTest {

ArrayList lst = new ArrayList();

Random generator = new Random();

 

void addRandom() {

lst.add(new Integer(generator.nextInt()));

}

 

 

public String toString() {

     return lst.toString();

}

 

public static void main(String args[]) {

    ArrayListTest tst = new ArrayListTest();

for(int i = 0; i < 100; i++ )

tst.addRandom();

     System.out.println("Стослучайныхчисел: "+tst.toString());

}

}

 

Рассмотрим данный пример подробнее. Здесь, кроме класса ArrayList, использованы еще ряд классов бибилиотеки Java.

  • Random — класс из java.util. Расширяет возможности класса Math по генерации случайных чисел (см. документацию).
  • Integer — так называемый wrapper-класс (класс-обертка) для целых (int). Он использован потому, что в коллекцию нельзя занести данные элементарных типов, а только объекты классов.

Класс ArrayListTest имеет два поля — поле lst класса ArrayList и поле generator класса Random, используемое для генерации случайных чисел. Метод addRandom() генерирует и заносит в коллекцию очередное случайное число. Метод toString() просто обращается к методу toString() класса ArrayList, который обеспечивает формирование представления списка в виде строки.

Метод main(...) создает объект класса ArrayListTest и организует цикл порождени 100 случайных чисел с занесением их в коллекцию, вызыва метод addRandom(). После этого он печатает результат.

Оттранслируем и запустим данную программу.

Этот пример не демонстрирует особых преимуществ коллекций, а лишь технику их использования. Из него видно, что добавить элемент в коллекцию можно методом add(...) класса ArrayList и при этом мы нигде не указываем размер коллекции.

Рассмотрим коллекции более систематично.

В Java коллекции объектов разбиты на три больших категории: List (список), Set (множество) и Map (отображение).

Посмотрим документацию. В java.util определены интерфейсы:

Collection

     |

     +------- List

     |

     +------- Set

 

Map

 

Эти интерфейсы составляют основу для построения классов коллекций Java.


Дата добавления: 2018-05-12; просмотров: 883; Мы поможем в написании вашей работы!

Поделиться с друзьями:




Мы поможем в написании ваших работ!