Структуры данных
 «Программы = алгоритмы + структуры данных»
    (Н. Вирт)
   Любая программа работает с данными
   Чем сложнее решаемая задача, тем более сложные
    требуются структуры данных
   Простейшая составная структура данных – массив
    однотипных элементов
   Обработка массивов, как правило, проста и быстра
Коллекции в Java
 Платформы Java содержат набор готовых классов,
  реализующих механизмы работы со структурами
  данных
 Такие классы называются коллекциями
  (collections)
 Хотя обработка массивов происходит быстрее, в
  ряде случаев требуется использовать коллекции
Предпосылки использования
 Необходимость динамического изменения размера
    структуры данных
   Динамическое добавление или удаление элемента
   Хранение разнотипных элементов (объектов)
   Извлечение и манипуляция данными из БД
   Хранение и работа со сложными структурами
    данных (деревьями, списками, стеками, хеш-
    таблицами и т.д.)
   и т.п.
Базовые интерфейсы и классы
 Интерфейс Collection предназначен для хранения
 однородных элементов. Его расширяют интерфейсы:
   List – список
   Set – множество
   Queue – очередь
 Интерфейс Map предназначен для создания коллекций,
 хранящих пары «ключ-значение». Его реализуют
 классы:
   HashMap
   IdentityHashMap
   LinkedHashMap
Иерархия классов и интерфейсов
          коллекций            <<interface>>
                                Collection
                                                                                                     <<interface>>
                         +add                                                                            Map
                         +addAll
                         +clear                                                                   +clear
                         +contains                                                                +containsKey
                         +containsAll                                                             +containsValue
                                                               <<interface>>
                         +equals                                                                  +entrySet
                                                                  Iterator
                         +hashCode                                                                +equals
                         +isEmpty                                                                 +get
                         +iterator                                                                +hashCode
                                                               <<interface>>                      +isEmpty
                         +remove
                                                                ListIterator                      +keySet
                         +removeAll
                         +retainAll                                                               +put
                         +size                                                                    +putAll
                         +toArray                                                                 +remove
                                                                                                  +values




          <<interface>        <<interface>>    <<interface>>                      <<interface>>
               >                   List           Queue                            SortedMap
              Set

                                                                                                      HashTable      HashMap

                                                                        <<interface>>
                 <<interface>>
                                                                           Deque
                   SortedSet


                                 ArrayList      LinkedList     PriorityQueu             TreeMap       Properties     LinkedHashM
                                                                     e                                                    ap

HashSet             TreeSet                                               ArrayDequ
                                                                              e
Специфика хранения элементов
 Коллекции могут хранить только ссылки на
  объекты.
 Примитивные типы могут быть сохранены в
  коллекции и извлечены из неё за счёт
  автоматических операций упаковки и распаковки в
  классы-оболочки (Boxing и Unboxing, с Java SE 5)
 Начиная с версии Java SE 5, коллекции стали
  типизированными и при их создании
  рекомендуется указывать тип объектов, кот. будут
  храниться в ней
ArrayList<String> arr = new ArrayList<String>();
Методы интерфейса Collection
 boolean add(Object o) – Добавляет элемент в
 коллекцию; возвращает true если элемент был добавлен, и
 false, если коллекция не позволяет сохранять дубликаты, а
 добавляемый элемент таковым является.

 boolean addAll(Collection coll) – Добавляет все
 элементы в коллекцию; возвращает true если какой-либо
 элемент был добавлен.

 void clear() – Удаляет из коллекции все элементы. При
 этом те элементы, на кот. имеются ссылки у других
 элементов, не удаляются из памяти.

 boolean contains(Object o) – Возвращает true если
 коллекция содержит заданный элемент.
Методы интерфейса Collection
(продолжение)
 boolean containsAll(Collection<?> coll) –
 Возвращает true если коллекция содержит все элементы из
 coll.

 boolean equals(Object o) – Возвращает true если
 сравниваемые коллекции равны.

 int hashCode() – Возвращает значение хэш кода для
 данной коллекции. Для любого класса, для которого
 переопределен метод Object.equals() должен быть
 переопределен метод Object.hashCode()

 boolean isEmpty() – Возвращает true если коллекция
 не содержит элементов.
Методы интерфейса Collection
(продолжение)
 Iterator iterator() – Возвращает ссылку на объект
  Iterator, который позволяет выполнить эффективное,
  последовательное прохождение по всем элементам коллекции.

 boolean remove(Object o) – Удаляет из коллекции
  одиночный экземпляр элемента o; возвращает true, если
  коллекция содержит такой элемент.

 boolean removeAll(Collection<?> coll) – Удаляет их
  коллекции все элементы, которые также находятся в коллекции
  coll; возвращает true если какой-либо элемент удален. Никакие
  элементы в результирующей коллекции не будут равны элементам
  коллекции coll. Параметр coll необязателен.
Пример работы с итераторами
List compon = Arrays.asList(this.getComponents());

for (Iterator iter=compon.iterator(); iter.hasNext(); ) {
       Object elem = (Object) iter.next();
       System.out.println(“Компонент: ”, elem.toString();
}
Методы интерфейса Collection
(продолжение)
 boolean retainAll(Collection<?> coll) – Оставляет в
  коллекции только те из входящих в неё элементов, которые входят
  в коллекции coll; возвращает true, если исходная коллекция
  изменена.

 int size() – Возвращает количество элементов в коллекции.


 Object[] toArray() – Возвращает массив, содержащий все
  элементы данной коллекции.
Методы интерфейса Collection
(продолжение)
 <T> T[] toArray(T[] a) – Возвращает массив, содержащий
  все элементы данной коллекции; тип возвращаемого массива
  таков, как тип заданного массива. Если коллекция вмещается в
  заданный массив, она возвращается в массиве. В противном случае
  размещается массив с типом времени выполнения для заданного
  массива и размером равным размеру коллекции.

 String toString() – Возвращает строку со списком элементов
  коллекции в квадратных скобках, через запятую и пробел
Интерфейс List - список
 Представляет собой неупорядоченную коллекцию,
  в которой допустимы дублирующие значения
 Классы, реализующие List:
   LinkedList – связанный список, можно вставлять
    элементы только в начало и конец
   ArrayList – динамический массив с произвольной
    вставкой и удалением элементов
 Элементы, находящиеся в коллекции List
 проиндексированы
Методы интерфейса List
 <T>Elem get(int i) – Возвращает ссылку на
  элемент списка под номером i
 int indexOf(<T> obj) – Возвращает индекс
  (номер) элемента obj. Если объект не найден,
  возвращает -1.
 ListIterator listIterator([int i]) –
  Возвращает итератор списка с дополнительными
  возможностями (по сравнению с Iterator). Если указан
  параметр i, то итератор будет позиционирован на
  элемент с индексом i
Методы интерфейса List
 boolean remove(int i) – удаляет из списка
  элемент с номером i.
 set(int i, <T> obj) – заменяет элемент с номером
  i на указанный элемент obj
 List subList(i1, i2) – возвращает ссылку на
  подсписок, содержащий элементы исходного списка с
  номерами от i1 до i2
Методы класса Collections
 Collections.addAll(c,e1,e2,…,en) – добавляет в
  коллекцию c произвольное число элементов e1, …, en
 frequency(c, obj) – возвращает число вхождений
  элемента obj в коллекцию с
 reverse(list) – обращает порядок следования
  элементов в списке list
 sort(list) – сортирует список в порядке возрастания
  элементов. Сравнение идёт с помощью вызова метода
  e1.compareTo(e2) для элементов списка e1, e2
Класс LinkedList
 порожден от класса AbstractSequentialList
 Реализация связанного двунаправленного списка –
  каждый элемент ссылается на предыдущий и на
  последующий элементы
 Есть методы addFirst() и addLast()
 Создаётся типизированная коллекция, в которой
  могут храниться только элементы типа String:
 LinkedList<String> list = new LinkedList<String>();
 Любая попытка внести в список ссылку на объект
  другого типа приведет к ошибке компиляции:
 list.add( new Double(12.4) );
Пример использования LinkedList
import java.util.*;
public class TestList {
  public static void main(String args[]){
     String s = "test";
     LinkedList<String> list = new LinkedList<String>();
     list.add( "is" );
                                                        Результат:
     list.add( "is" );
     list.add( "a" );              [This, is, is, a, a, null, test]
     list.add( "a" );              The size of the Collection is : 7
     list.add( null );             This is is a a null test
     list.addLast( s );
     list.addFirst("This");
  // list.add( new Double(12.4) ); ошибка компиляции
     System.out.println( list );
       displayCollection( list );
   }
  static void displayCollection( Collection<String> items ) {
      final String BLANK = " ";
      System.out.println("The size of the Collection is : " +
items.size());
      StringBuilder sb = new StringBuilder();
      for( String s : items ) sb.append( s ).append( BLANK );
      System.out.println( sb.toString() );
   }
}
ArrayList
 порожден от класса AbstractList для
  реализации списка, основанного на динамически
  изменяющемся массиве
 Нет методы addFirst() и addLast(), но есть метод
  void add( int index, E element ) для вставки
  элемента в произвольную позицию
Пример использования LinkedList
. . .
 public static void main(String args[]){
     String s = "test";
     List<String> list = new ArrayList<String>();
     list.add( "is" );
     list.add( "is" );
                                                        Результат:
     list.add( "a" );
     list.add( "a" );              [This, is, is, a, a, null, test]
     list.add( null );             The size of the Collection is : 7
     list.add( list.size(), s );   This is is a a null test
     list.add( 0, "This");
  // list.add( new Double(12.4) ); ошибка компиляции
     System.out.println( list );
       displayCollection( list );
   }
. . .

Коллекции в Java

  • 2.
    Структуры данных  «Программы= алгоритмы + структуры данных» (Н. Вирт)  Любая программа работает с данными  Чем сложнее решаемая задача, тем более сложные требуются структуры данных  Простейшая составная структура данных – массив однотипных элементов  Обработка массивов, как правило, проста и быстра
  • 3.
    Коллекции в Java Платформы Java содержат набор готовых классов, реализующих механизмы работы со структурами данных  Такие классы называются коллекциями (collections)  Хотя обработка массивов происходит быстрее, в ряде случаев требуется использовать коллекции
  • 4.
    Предпосылки использования  Необходимостьдинамического изменения размера структуры данных  Динамическое добавление или удаление элемента  Хранение разнотипных элементов (объектов)  Извлечение и манипуляция данными из БД  Хранение и работа со сложными структурами данных (деревьями, списками, стеками, хеш- таблицами и т.д.)  и т.п.
  • 5.
    Базовые интерфейсы иклассы  Интерфейс Collection предназначен для хранения однородных элементов. Его расширяют интерфейсы:  List – список  Set – множество  Queue – очередь  Интерфейс Map предназначен для создания коллекций, хранящих пары «ключ-значение». Его реализуют классы:  HashMap  IdentityHashMap  LinkedHashMap
  • 6.
    Иерархия классов иинтерфейсов коллекций <<interface>> Collection <<interface>> +add Map +addAll +clear +clear +contains +containsKey +containsAll +containsValue <<interface>> +equals +entrySet Iterator +hashCode +equals +isEmpty +get +iterator +hashCode <<interface>> +isEmpty +remove ListIterator +keySet +removeAll +retainAll +put +size +putAll +toArray +remove +values <<interface> <<interface>> <<interface>> <<interface>> > List Queue SortedMap Set HashTable HashMap <<interface>> <<interface>> Deque SortedSet ArrayList LinkedList PriorityQueu TreeMap Properties LinkedHashM e ap HashSet TreeSet ArrayDequ e
  • 7.
    Специфика хранения элементов Коллекции могут хранить только ссылки на объекты.  Примитивные типы могут быть сохранены в коллекции и извлечены из неё за счёт автоматических операций упаковки и распаковки в классы-оболочки (Boxing и Unboxing, с Java SE 5)  Начиная с версии Java SE 5, коллекции стали типизированными и при их создании рекомендуется указывать тип объектов, кот. будут храниться в ней ArrayList<String> arr = new ArrayList<String>();
  • 8.
    Методы интерфейса Collection boolean add(Object o) – Добавляет элемент в коллекцию; возвращает true если элемент был добавлен, и false, если коллекция не позволяет сохранять дубликаты, а добавляемый элемент таковым является.  boolean addAll(Collection coll) – Добавляет все элементы в коллекцию; возвращает true если какой-либо элемент был добавлен.  void clear() – Удаляет из коллекции все элементы. При этом те элементы, на кот. имеются ссылки у других элементов, не удаляются из памяти.  boolean contains(Object o) – Возвращает true если коллекция содержит заданный элемент.
  • 9.
    Методы интерфейса Collection (продолжение) boolean containsAll(Collection<?> coll) – Возвращает true если коллекция содержит все элементы из coll.  boolean equals(Object o) – Возвращает true если сравниваемые коллекции равны.  int hashCode() – Возвращает значение хэш кода для данной коллекции. Для любого класса, для которого переопределен метод Object.equals() должен быть переопределен метод Object.hashCode()  boolean isEmpty() – Возвращает true если коллекция не содержит элементов.
  • 10.
    Методы интерфейса Collection (продолжение) Iterator iterator() – Возвращает ссылку на объект Iterator, который позволяет выполнить эффективное, последовательное прохождение по всем элементам коллекции.  boolean remove(Object o) – Удаляет из коллекции одиночный экземпляр элемента o; возвращает true, если коллекция содержит такой элемент.  boolean removeAll(Collection<?> coll) – Удаляет их коллекции все элементы, которые также находятся в коллекции coll; возвращает true если какой-либо элемент удален. Никакие элементы в результирующей коллекции не будут равны элементам коллекции coll. Параметр coll необязателен.
  • 11.
    Пример работы ситераторами List compon = Arrays.asList(this.getComponents()); for (Iterator iter=compon.iterator(); iter.hasNext(); ) { Object elem = (Object) iter.next(); System.out.println(“Компонент: ”, elem.toString(); }
  • 12.
    Методы интерфейса Collection (продолжение) boolean retainAll(Collection<?> coll) – Оставляет в коллекции только те из входящих в неё элементов, которые входят в коллекции coll; возвращает true, если исходная коллекция изменена.  int size() – Возвращает количество элементов в коллекции.  Object[] toArray() – Возвращает массив, содержащий все элементы данной коллекции.
  • 13.
    Методы интерфейса Collection (продолжение) <T> T[] toArray(T[] a) – Возвращает массив, содержащий все элементы данной коллекции; тип возвращаемого массива таков, как тип заданного массива. Если коллекция вмещается в заданный массив, она возвращается в массиве. В противном случае размещается массив с типом времени выполнения для заданного массива и размером равным размеру коллекции.  String toString() – Возвращает строку со списком элементов коллекции в квадратных скобках, через запятую и пробел
  • 14.
    Интерфейс List -список  Представляет собой неупорядоченную коллекцию, в которой допустимы дублирующие значения  Классы, реализующие List:  LinkedList – связанный список, можно вставлять элементы только в начало и конец  ArrayList – динамический массив с произвольной вставкой и удалением элементов  Элементы, находящиеся в коллекции List проиндексированы
  • 15.
    Методы интерфейса List <T>Elem get(int i) – Возвращает ссылку на элемент списка под номером i  int indexOf(<T> obj) – Возвращает индекс (номер) элемента obj. Если объект не найден, возвращает -1.  ListIterator listIterator([int i]) – Возвращает итератор списка с дополнительными возможностями (по сравнению с Iterator). Если указан параметр i, то итератор будет позиционирован на элемент с индексом i
  • 16.
    Методы интерфейса List boolean remove(int i) – удаляет из списка элемент с номером i.  set(int i, <T> obj) – заменяет элемент с номером i на указанный элемент obj  List subList(i1, i2) – возвращает ссылку на подсписок, содержащий элементы исходного списка с номерами от i1 до i2
  • 17.
    Методы класса Collections Collections.addAll(c,e1,e2,…,en) – добавляет в коллекцию c произвольное число элементов e1, …, en  frequency(c, obj) – возвращает число вхождений элемента obj в коллекцию с  reverse(list) – обращает порядок следования элементов в списке list  sort(list) – сортирует список в порядке возрастания элементов. Сравнение идёт с помощью вызова метода e1.compareTo(e2) для элементов списка e1, e2
  • 18.
    Класс LinkedList  порожденот класса AbstractSequentialList  Реализация связанного двунаправленного списка – каждый элемент ссылается на предыдущий и на последующий элементы  Есть методы addFirst() и addLast()  Создаётся типизированная коллекция, в которой могут храниться только элементы типа String:  LinkedList<String> list = new LinkedList<String>();  Любая попытка внести в список ссылку на объект другого типа приведет к ошибке компиляции:  list.add( new Double(12.4) );
  • 19.
    Пример использования LinkedList importjava.util.*; public class TestList { public static void main(String args[]){ String s = "test"; LinkedList<String> list = new LinkedList<String>(); list.add( "is" ); Результат: list.add( "is" ); list.add( "a" ); [This, is, is, a, a, null, test] list.add( "a" ); The size of the Collection is : 7 list.add( null ); This is is a a null test list.addLast( s ); list.addFirst("This"); // list.add( new Double(12.4) ); ошибка компиляции System.out.println( list ); displayCollection( list ); } static void displayCollection( Collection<String> items ) { final String BLANK = " "; System.out.println("The size of the Collection is : " + items.size()); StringBuilder sb = new StringBuilder(); for( String s : items ) sb.append( s ).append( BLANK ); System.out.println( sb.toString() ); } }
  • 20.
    ArrayList  порожден откласса AbstractList для реализации списка, основанного на динамически изменяющемся массиве  Нет методы addFirst() и addLast(), но есть метод void add( int index, E element ) для вставки элемента в произвольную позицию
  • 21.
    Пример использования LinkedList .. . public static void main(String args[]){ String s = "test"; List<String> list = new ArrayList<String>(); list.add( "is" ); list.add( "is" ); Результат: list.add( "a" ); list.add( "a" ); [This, is, is, a, a, null, test] list.add( null ); The size of the Collection is : 7 list.add( list.size(), s ); This is is a a null test list.add( 0, "This"); // list.add( new Double(12.4) ); ошибка компиляции System.out.println( list ); displayCollection( list ); } . . .