- •Лабораторная 8. Динамические структуры. Коллекции списки в c# и Java
- •Добавление элемента;
- •Динамические структуры данных
- •Списки, их виды Односвязный список
- •Двусвязный список
- •Классы c# для описания указанных типов данных Класс List и его методы
- •Класс LinkedList и его методы
- •Класс LinkedListNode представляет узел в LinkedList. Его свойства:
- •Классы-коллекции
- •Классы-коллекции в Java
- •Абстрактные классы
- •Понятие интерфейса в Java. Описание интерфейса
- •Реализация интерфейса
- •Интерфейсы-коллекции
- •Интерфейс Collection
- •Интерфейс List
- •Классы коллекций
- •Класс LinkedList
- •Лямбда - выражения в Java
- •В лямбда – выражение передаются не только данные, но и поведение
Классы-коллекции в Java
Коллекция — это группа элементов с операциями добавления, извлечения и поиска элемента. Механизм работы операций существенно различается в зависимости от типа коллекции. Например, элементы стека упорядочены в последовательность, добавление нового элемента может происходить только в конец этой последовательности, и получить можно только элемент, находящийся в конце (то есть, добавленный последним). Очередь, напротив, позволяет получить лишь первый элемент (элементы добавляются в один конец последовательности, а «забираются» с другого). Другие коллекции (например, список) позволяют получить элемент из любого места последовательности.
Язык Java предоставляет библиотеку стандартных коллекций, которые собраны в пакете java.util, поэтому нет необходимости программировать их самостоятельно.
Классы-коллекции
Коллекции в библиотеке java.util представлены набором классов и интерфейсов.
Каждый класс реализует некоторую коллекцию со специфичным для нее набором операций доступа к элементам. Чтобы использовать коллекцию в своей программе, нужно создать объект соответствующего класса.
Элементы большинства коллекций имеют тип Object. Это значит, что (в отличие от обычного массива) не нужно заранее указывать тип элементов, которые будут помещены в коллекцию. Можно добавлять в нее объекты любого класса, поскольку все классы являются наследниками класса Object, более того — в одной коллекции могут храниться объекты совершенно разных классов.
Конечно, это может привести и к трудностям. Если необходимо совершать какие-то операции над элементом коллекции (а объекты помещаются в коллекцию именно для того, чтобы потом их извлекать и обрабатывать), невозможно воспользоваться его методами, не приведя объект к его «настоящему» классу посредством явного приведения типов.
Например, имеется объект класса String (обычная строка) и нужно добавить его в стек (класс stack) с помощью метода push(Object item):
String str = "Ценная строка"; stack.push(str);
Коллекция, хранящая элементы типа Object, сразу же «забывает», что ваш объект — строка, поскольку при его добавлении было осуществлено автоматическое приведение типа String к типу Object. Его можно извлечь методом pop(), но чтобы вернуть ему прежний тип (а без этого невозможно воспользоваться ни одним из его методов), придется осуществить явное преобразование оператором (String):
str = (String)stack.pop();
Это не является проблемой, просто нужно помнить, объекты какого класса помещаеются в коллекцию и выполнять соответствующее преобразование типа над каждым побывавшим в коллекции элементом.
Но если попытаться привести объект к неправильному типу, возникнет ошибка в программе:
stack.push(new Dog("Шарик", 12)); // помещаем в стек собаку
str = (Mouse)stack.pop(); // вынимаем собаку и пытаемся объявить ее мышью, но эти классы не связаны наследованием и программа выдаст ошибку во время выполнения
Так что возможностью помещать в коллекцию любые объекты воспользоваться скорее всего не получится. Поэтому в каждую коллекцию следует помещать объекты только одного класса (и производных от него).
