Материал: 8

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

List<? extends Fruit> fruits = new ArrayList<Fruit>();

//Всем тоды add неработаютсошибкойкомпиляции fruits.add(new Object()); fruits.add(new Fruit()); fruits.add(new Apple()); fruits.add(new Citrus()); fruits.add(new Orange());

//Этотмеработаетод

 

 

Object o = fruits.get(0);

get

//Остальныеметоды

get нерабо тают,потомучто

возвращает Object инужноприводитьбъектунужному типу

Fruit f = fruits.get(0); Apple a = fruits.get(0); Citrus c = fruits.get(0); Orange or = fruits.get(0);

Маски

\\Методкомпилируется

public static List<?> getList() {

List<Fruit> fruits = new ArrayList<Fruit>(); fruits.add(new Apple());

return fruits;

}

List<?> wFruits1 = getList(); \\Работает List<Fruit> wFruits2 = getList();\\Ошибка компиляции

List<Apple> wFruits3 = getList();\\Ошибка компиляции

public static void addToList(List<?> fruits) { \\add не работают все

fruits.add(new Fruit()); fruits.add(new Apple()); fruits.add(new Citrus()); fruits.add(new Orange());

Object o = fruits.get(0); \\работает

\\остальные get неработают

Fruit f = fruits.get(0); Citrus c = fruits.get(0); Orange or = fruits.get(0);

}

//всевызовыневызываютошибкикомпиляции

addToList(new ArrayList<Fruit>()); addToList(new ArrayList<Apple>()); addToList(new ArrayList<Citrus>()); addToList(new ArrayList());

Ограничение снизу

Определяет ограничение супертипа:

<? super sub>

Некоторый конкретный тип, параметр которого является суперклассом для sub.

Имеется:

List<Integer> list = new ArrayList<Integer>(); Map<Integer, Comparable<String>> m =

new HashMap<Integer,Comparable<String>>(); // Зачемдварписатьзаоднотоже???

Необходимо:

List<Integer> list = new ArrayList<>(); Map<Integer, Comparable<String>> m =

new HashMap<>();

Вывод типа (type inference) (Java 1.7)

Можно использовать, если компилятор из контекста может понять, какие типы нужны.

<> – «алмазная запись» (diamond notation)

В основном используется при создании объектов в ходе инициализации переменных. При создании объектов нельзя путать отсутствие указания типа (будет обобщенный тип) и оператор алмаз (будет вывод типа). Из-за механизма стирания в параметризованных типах могут возникать непроверяемые компилятором приведения.

Коллекции в Java (Collections)

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

Какие бывают Коллекции?

Существуют два главных интерфейса (рисунок 8.3) для всех типов коллекций в Java:

-Collection<E>;

-Map<K,V>.

Рисунок 8.3 – Типы коллекций

Другие Коллекции

- Guava (Google Collections Library) - библиотека добавляет несколько полезных реализаций структур данных, таких как мультимножество, мультиотображение и двунаправленное отображение. Улучшена эффективность.

-Trove library - реализация коллекций, позволяющая хранить примитивы (в Java Collections Framework примитивы хранить нельзя, только оберточные типы), что позволяет повысить эффективность работы.

-PCJ (Primitive Collections for Java) - так же, как и Trove

предназначены для примитивных типов, что позволит повысить эффективность.

- Наконец Вы сами можете написать собственную коллекцию (тот же связной список). Но данный подход не рекомендуется.

Рекомендуется для начала необходимо освоить базовые коллекции Java которыми пользуются чаще всего. А также некоторые сторонние библиотеки реализуют интерфейсы Java Collections Framework (пример Guava http://guava- libraries.googlecode.com/svn/tags/release05/javadoc/overview-tree.html). То есть знание иерархии классов базовых коллекций позволит более быстро освоить сторонние библиотеки.

Базовые интерфейсы

В библиотеке коллекций Java существует два базовых интерфейса, реализации которых и представляют совокупность всех классов коллекций:

-Collection - коллекция содержит набор объектов (элементов);

-Map - описывает коллекцию, состоящую из пар "ключ —

значение".

Хоть фреймворк называется Java Collections Framework, но интерфейс map и его реализации входят в фреймворк тоже. Интерфейсы Collection и Map являются базовыми, но они не есть единственными. Их расширяют другие интерфейсы, добавляющие дополнительный функционал.

Collection - коллекция содержит набор объектов (элементов). Здесь определены основные методы для манипуляции с данными, такие как вставка (add, addAll), удаление (remove, removeAll, clear), поиск (contains).

Map - описывает коллекцию, состоящую из пар "ключ — значение". У каждого ключа только одно значение, что соответствует математическому понятию однозначной функции или отображения (тар). Такую коллекцию часто называют еще словарем (dictionary) или ассоциативным массивом (associative array). Никак НЕ относится к интерфейсу Collection и является самостоятельным.

Интерфейс Collection расширяют три интерфейса:

-List;

-Set;

-Queue.

Рассмотрим, зачем нужен каждый:

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

Set - описывает неупорядоченную коллекцию, не содержащую повторяющихся элементов. Это соответствует математическому понятию множества (set).

Queue - очередь. Это коллекция, предназначенная для хранения элементов в порядке, нужном для их обработки. В дополнение к базовым операциям интерфейса Collection, очередь предоставляет дополнительные операции вставки, получения и контроля.

Java.util.LinkedList

Используется, если вы хотите пройти по списку и посмотреть / изменить элементы в списке, вы используете объект итератора для этого списка (так же, как с другими коллекциями, которые реализуют Iterable интерфейс; все они имеют метод iterator (), который возвращает итератор).