
- •Лабораторная работа № 4 Работа с исключениями и коллекциями
- •Исключения в Java. Теоретические сведения
- •Использование try, catch и throw
- •Использование множественного catch и finally
- •Использование ключевого слова throws
- •Системные исключения
- •UnsupportedOperationException - обнаружена неподдерживаемая операция Коллекции (перечислимые типы) в Java. Теоретические сведения.
- •Иерархия интерфейсов коллекций
- •Назначение интерфейсов, расширяющих интерфейс Collection
- •Рабочие классы интерфейса List
- •Массив типа ArrayList
- •Методы класса ArrayList
- •Массив типа LinkedList
- •Методы класса LinkedList
- •Ассоциативные массивы в Java
- •Диаграмма интерфейса Map
- •Рабочие классы интерфейса Map
- •Задание
- •Приложение 1. Работа с датой и временем в Java
- •Приложение 2. Пример общего класса обработки ошибок, сообщений и логирования.
Рабочие классы интерфейса List
List |
|
ArrayList |
LinkedList |
Инкапсулирует в себе обычный массив, длина которого автоматически увеличивается при добавлении новых элементов. Так как ArrayList использует массив, то время доступа к произвольному элементу по индексу минимально (В отличии от LinkedList). При удалении произвольного элемента из списка, все элементы находящиеся «правее» смещаются на одну ячейку влево, при этом реальный размер массива (его емкость, capacity) не изменяется. Если при добавлении элемента, оказывается, что массив полностью заполнен, будет создан новый массив размером (n * 3) / 2 + 1, в него будут помещены все элементы из старого массива + новый, добавляемый элемент. |
Двусвязный список. Это структура данных, состоящая из узлов, каждый из которых содержит как собственно данные, так и две ссылки («связки») на следующий и предыдущий узел списка. Доступ к произвольному элементу осуществляется за линейное время (но доступ к первому и последнему элементу списка всегда осуществляется за константное время — ссылки постоянно хранятся на первый и последний, так что добавление элемента в конец списка вовсе не значит, что придется перебирать весь список в поисках последнего элемента). |
Таким образом, в ArrayList операции с существующими элементами выполняются за константное время, а операции добавления и удаления элементов за линейное (т.е. зависящее от длины массива). |
Таким образом в LinkedList за постоянное время (О(1)) выполняется вставку/удаление элементов в начале и конце списка, а доступ к произвольному элементу осуществляется за линейное время (О(n)). |
Массив типа ArrayList
Применяется для хранения данных с большой частотой доступа по индексу.
Если вызывается конструктор ArrayList без параметров, то по умолчанию будет создан массив из 10-ти элементов типа Object, которые затем приводятся к заданному типу. В примере это тип String. Добавление трех элементов, очевидно не приводит к росту длины массива и поэтому добавление осуществляется за константное время, т.е. время не зависящее от размера массива т.к. никаких манипуляций с другими элементами здесь не производится. Очевидно так можно добавить 10 элементов. Сложность этой операции будет O(1). Если попытаться добавить 11-й элемент, то размер массива будет увеличен до (10*3)/2+1=16 элементов. Таким образом, добавление элемента с выходом за границу текущего размера динамического массива приводит к добавлению количества элементов, зависящего от текущей дины массива. Сложность этой операции будет O(n) т. е. Пропорциональна размеру массива.
Такой же сложностью O(n) обладают операции вставки внутрь массива add(int, value) и удаления изнутри масиива по индексу remove(int) или значению remove(value) т. к. приводитк сдвигу элментов вправо, относительно вставляемого элемента.
Следует обратить внимание на то, что с ростом размерности массива, при каждом шаге увеличения размера пропорционально размерности n массива растет количество выделенных, но не занятых ячеек памяти. При этом удаление элементов методом remove приводит к сдвигу элемнтов массива влево, но не освобождению памяти, выделенной ранее при каждом шаге. Поэтому в ArrayList невыгодно хранить данные которые часто добавляются и удаляются (дергают размер массива), но выгодно хранить данные, которые сравнительно редко добавляются и удаляются, но которые часто требуется извлекать по индексу.