Collections Framework

  • Набор контейнеров
    • Интерфейсы
    • Реализации
    • Алгоритмы
  • Пакет java.util

Коллекции

  • Коллекция ─ неупорядоченный набор элементов
  • Интерфейс Collection<E>
    • <E> ─ тип элемента

Немодифицирующие операции

Модифицирующие операции

Пример. Чтение в коллекцию

  • public int read(String file, Collection<String> c)
            throws IOException {
        Scanner scanner =
            new Scanner(Paths.get(file), "UTF-8");
        int read = 0;
        while (scanner.hasNext()) {
            read++;
            c.add(scanner.next());
        }
        return read;
    }
    

Итераторы

Интерфейс итератора

Применение итераторов

  • Обход коллекции
    for (Iterator<E> i = c.iterator(); i.hasNext(); ) {
        final E element = i.next();
        ...
    }
    
  • Фильтрация коллекции
    for (Iterator<E> i = c.iterator(); i.hasNext(); ) {
        if (!p(i.next()) {
            i.remove();
        }
    }
    

Интерфейс Iterable

  • Расширенный for
  • Код
    • for (T element : collection) {
          ...
      }
      
  • Эквивалентен
    • for (Iterator<T> i = collection.iterator(); i.hasNext(); ) {
          T element = i.next();
          ...
      }
      

Пример. Вывод коллекции на экран

  • public void dump(Collection<String> c) {
        for (Iterator<String> i = c.iterator(); i.hasNext(); ) {
            final String word = i.next();
            System.out.print(word + ", ");
        }
        System.out.println();
    }
    

Преобразование в массив

  • Методы
  • Пример использования
    String[] lines = c.toArray(new String[c.size()]);
    String[] lines = c.toArray(String[]::new);
    
  • В каком порядке идут элементы?
    • В порядке обхода итератором

Класс AbstractCollection

  • Позволяет быстро реализовывать коллекции
  • Реализация неизменяемых коллекций
  • Реализация изменяемых коллекций

Множества

  • Множество ─ коллекция без повторяющихся элементов
  • Интерфейс Set<E> extends Collection<E>

Сравнение элементов

  • Метод object.equals(object)
  • Рефлексивность
    • x.equals(x)
  • Симметричность
    • x.equals(y) == y.equals(x)
  • Транзитивность
    • x.equals(y)y.equals(z)x.equals(z)
  • Устойчивость
    • x.equals(y) не изменяется, если x и y не изменяются
  • Обработка null
    • x.equals(null) == false

Пример equals (1)

  • Точка на плоскости
    • public class Point {
          protected int x;
          protected int y;
          public boolean equals(Object o) {
              if (o instanceof Point) {
                  Point that = (Point) o;
                  return this.x == that.x && this.y == that.y;
              }
              return false;
          }
      }
      

Пример equals (2)

  • Цветная точка на плоскости
    • public class ColorPoint extends Point {
          protected int c;
          public boolean equals(Object o) {
              if (o instanceof ColorPoint) {
                  ColorPoint that = (ColorPoint) o;
                  return this.x == that.x && this.y == that.y && this.c == that.c;
              }
              return false;
          }
      }
      
  • Где проблема?
    • Несимметричность

Пример equals (3)

  • Цветная точка на плоскости
    • public class ColorPoint extends Point {
          protected int c;
          public boolean equals(Object o) {
              if (o instanceof ColorPoint) {
                  ColorPoint that = (ColorPoint) o;
                  return this.x == that.x && this.y == that.y && this.c == that.c;
              }
              return super.equals(o);
          }
      }
      
  • А теперь?
    • Нетранзитивность

Наследование и equals

  • equals(object) и наследование ⇒ проблемы
  • Варианты решения
    • Сравнивать объекты только одинакового класса
    • Сравнивать как предков
    • Послойное сравнение
      • canEquals

Операции над множествами

Классы HashSet и LinkedHashSet

Вычисление хэшей

  • Метод object.hashCode()
  • Устойчивость
    • hashCode() не изменяется, если объект не изменяется
  • Согласованность с equals(object)
    • x.equals(y)x.hashCode() == y.hashCode()

Пример. Поиск уникальных слов

  • Set<String> words = new HashSet<String>();
    int total = read(args[0], words);
    System.out.println("Words total: " + total);
    System.out.println("Unique words: " +
        words.size());
    dump(words);
    

Класс EnumSet

Неизменяемые множества

Класс AbstractSet

  • Позволяет быстро реализовывать множества
  • Неизменяемые множества
  • Изменяемые множества

Списки

  • Список ─ коллекция с индексированными элементами
  • Интерфейс List<E> extends Collection<E>

Операции со списками

Подсписки (виды)

  • l.delete(2) либо sl.delete(1)
  • l.add(1, X) либо sl.add(0, X)

Итератор по списку

Операции итератора по списку

Класс ArrayList

Применение ArrayList

  • Плюсы
    • Быстрый доступ по индексу
    • Быстрая вставка и удаление элементов с конца
  • Минусы
    • Медленная вставка и удаление элементов
  • Примеры
    • Замена массива
    • “Бесконечный” массив
    • Стек

Пример. Вывод ArrayList на экран

  • List<E> list = new ArrayList<E>();
    …
    for (int i = list.size() - 1; i >= 0; i--) {
        System.out.println(list.get(i));
    }
    

Класс LinkedList

Применение LinkedList

  • Плюсы
    • Быстрое добавление и удаление элементов
  • Минусы
    • Медленный доступ по индексу
    • Большое потребление памяти
  • Примеры
    • Стек
    • Очередь
    • Дек

Пример. Вывод LinkedList на экран

  • List<E> list = new LinkedList<E>();
    …
    for (ListIterator<E> li = list.listIterator(list.size());
        li.hasPrevious(); )
    {
        System.out.println(li.previous());
    }
    

Неизменяемые списки

Класс AbstractList

  • Позволяет быстро реализовывать списки с произвольным доступом
  • Неизменяемые списки
  • Изменяемые списки
  • Списки переменной длины

Класс AbstractSequentialList

  • Позволяет быстро реализовывать списки с последовательным доступом
  • Неизменяемые списки
  • Изменяемые списки
  • Списки переменной длины

Очередь

  • Очередь – хранилище элементов для обработки
  • Интерфейс Queue<E> extends Collection<E>
  • Свойства очередей
    • Не могут хранить null
    • Различные порядки элементов
    • Может быть ограничен размер
    • Может не принять элемент

Методы очередей

Класс LinkedList

  • Очередь на двусвязном списке

Класс AbstractQueue

  • Позволяет быстро реализовывать очереди
  • Методы
  • Почему методы без исключений?
    • Исключения дорогие

Деки

Последовательность элементов

Реализации

Отображения

Содержание

Отображение

  • Отображение ─ множество пар ключ-значение при уникальности ключа
  • Интерфейс Map<K, V>

Методы отображений (1)

Методы отображений (2)

Пары

Классы HashMap и LinkedHashMap

Пример. Подсчет слов в тексте (1)

  • Map<String, Integer> map
        = new HashMap<String, Integer>();
    while (scanner.hasNext()) {
        String word = scanner.next();
        Integer count = map.get(word);
        map.put(word, count == null ? 1 : count + 1);
    }
    

Пример. Подсчет слов в тексте (2)

  • for (
        Map.Entry<String, Integer> entry :
            map.entrySet()
    ) {
        System.out.println(
             entry.getKey() + " " + entry.getValue());
    }
    

Класс EnumMap

Неизменяемые отображения

Класс AbstractMap

  • Позволяет быстро реализовывать множества
  • Метод

Последовательные отображения

Упорядоченные коллекции

Содержание

Сравнение элементов

Сравнение элементов (контракт)

  • Транзитивность
  • Антисимметричность
    • sgn(x.compareTo(y))) == -sgn(y.compareTo(x))
  • Согласованность с равенством
    • x.compareTo(y) == 0sgn(x.compareTo(z))==sgn(y.compareTo(z))
  • Согласованность с equals(object)
    • x.equals(y) == (x.compareTo(y) == 0)

Упорядоченные множества (1)

Упорядоченные множества (2)

Упорядоченные отображения (1)

Упорядоченные отображения (2)

Класс PriorityQueue

  • Очередь с приоритетами
    • Минимальный элемент
    • На двоичной куче

Пример. Применение TreeSet

  • Естественный порядок
    SortedSet<String> words = new TreeSet<>();
    read(args[0], words);
    dump(words);
    
  • Порядок без учета регистра
    SortedSet<String> words = new TreeSet<>(
        String.CASE_INSENSITIVE_ORDER);
    read(args[0], words);
    dump(words);
    

Класс Collections

  • Алгоритмы для работы с коллекциями
    • Простые операции
    • Сортировка
    • Двоичный поиск
    • Поиск минимума и максимума
  • Специальные коллекции
  • Оболочки коллекций

Простые операции

Сортировки

Двоичный поиск

  • Осуществляет двоичный поиск в списке
    • Найден – индекс элемента
    • Не найден – –1 – индекс места вставки
  • Методы

Поиск минимума и максимума

Пример. Алгоритмы на списках

  • List<String> list = new ArrayList<String>();
    read(args[0], list);
    Collections.reverse(list);
    Collections.shuffle(list);
    Collections.sort(list);
    Collections.sort(list,
        String.CASE_INSENSITIVE_ORDER);
    Collections.fill(list, "temp");
    System.out.println(Collections.min(list));
    System.out.println(Collections.min(list,
        String.CASE_INSENSITIVE_ORDER));
    

Специальные коллекции (1)

Специальные коллекции (2)

Специальные коллекции (3)

Класс Arrays

  • Операции с массивами
    • Сортировка
    • Двоичный поиск
    • Поиск минимума и максимума
    • Заполнение
    • Преобразование в строку
    • ...
  • Вид массива как списка

Заключение

Содержание

Устаревшие коллекции

Ссылки

Вопросы

???