SlideShare a Scribd company logo
1 of 59
Язык программирования
JAVA
Лекция# 4
Структуры данных в Java
Моисеенко Антон
canggu@mail.ru
СПГУАП
Кафедра Информационно-Сетевых Технологий
Содержание курса
1. Коллекции
2. Множества
3. Списки
4. Очереди и деки
5. Отображения
6. Заключение
Коллекции
■ Коллекция ─ неупорядоченный
набор элементов
■ Интерфейс Collection
Коллекции в Java
■ «Платформы Java содержат набор
готовых классов, реализующих
механизмы работы со структурами
данных
■ Такие классы называются коллекциями
(collections)
■ Хотя обработка массивов происходит
быстрее, в ряде случаев требуется
использовать коллекции
Предпосылки использования
■ Необходимость динамического изменения
размера структуры данных
■ Динамическое добавление или удаление
элемента
■ Хранение разнотипных элементов
(объектов)
■ Извлечение и манипуляция данными из
БД
■ Хранение и работа со сложными
структурами данных (деревьями,
списками, стеками, хеш- таблицами и
т.д.) и т.п.
Базовые интерфейсы и
классы
■ Интерфейс Collection предназначен для
хранения однородных элементов. Его
расширяют интерфейсы:
■ List – список
■ Set – множество
■ Queue – очередь
■ Интерфейс Map предназначен для
создания коллекций, хранящих пары
«ключ-значение». Его реализуют классы:
■ HashMap
■ IdentityHashMap
■ TreeMap
Интерфейс Collection
Методы интерфейса
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
необязателен.
Методы интерфейса
Collection(продолжение)
■ boolean retainAll(Collection<?> coll) – Оставляет в
коллекции только те из входящих в неё элементов, которые
входят в коллекции coll; возвращает true, если исходная
коллекция изменена.
■ int size() – Возвращает количество элементов в коллекции.
■ Object[] toArray() – Возвращает массив, содержащий все
элементы данной коллекции.
Методы интерфейса
Collection(продолжение)
■ <T> T[] toArray(T[] a) – Возвращает массив, содержащий
все элементы данной коллекции; тип возвращаемого
массива таков, как тип заданного массива. Если коллекция
вмещается в заданный массив, она возвращается в
массиве. В противном случае размещается массив с типом
времени выполнения для заданного массива и размером
равным размеру коллекции.
■ String toString() – Возвращает строку со списком
элементов коллекции в квадратных скобках, через запятую
и пробел
Иерархия классов, реализующих
интерфейсы Collection
Иерархия классов и
интерфейсов Map
Специфика хранения
элементов
■ Коллекции могут хранить только ссылки
на объекты.
■ Примитивные типы могут быть сохранены
в коллекции и извлечены из неё за счёт
автоматических операций упаковки и
распаковки в классы-оболочки (Boxing и
Unboxing, с Java SE 5)
■ Начиная с версии Java SE 5, коллекции
стали типизированными и при их создании
рекомендуется указывать тип объектов,
кот. будут храниться в ней
ArrayList<String> arr = new ArrayList<String>();
Пример. Вывод коллекции на экран
public void dump(Collection c) {
for (Iterator i = c.iterator(); i.hasNext(); ) {
String word = (String) i.next();
System.out.print(word + ", ");
}
System.out.println();
}
Преобразование в массив
■ Object[] toArray() ─ создает новый массив
■ Object[] toArray(Object[] a) ─ использует переданный
массив
■ Пример использования
String[] i = (String[])c.toArray(new String[c.size()]);
Итераторы
■ Итератор ─ обход коллекции
■ Интерфейс Iterator
■ Метод Iterator Collection.iterator()
Методы итераторов
■ hasNext() ─ определение наличия следующего
элемента
■ next() ─ взятие следующего элемента
■ remove() ─ удаление элемента
■ Исключения
○ NoSuchElementException ─ бросается при
достижении конца коллекции
○ ConcurrentModificationException ─ бросается при
изменении коллекции
Применение итераторов
■ Обход коллекции
for(Iterator i = c.iterator(); i.hasNext(); ) {
Object element = i.next();
...
}
■ Фильтрование коллекции
for(Iterator i = c.iterator(); i.hasNext(); ) {
if (!((String)i.next()).equals(“Bla-bla”)) i.remove();
}
Пример работы с итераторами
List compon = Arrays.asList(this.getComponents());
for (Iterator iter=compon.iterator(); iter.hasNext(); ) {
Object elem = (Object) iter.next();
System.out.println(“Компонент: ”, elem.toString();
}
Множества
■ Множество ─ коллекция без
повторяющихся элементов
■ Интерфейс Set
Интерфейс Set
Сравнение элементов
■ Метод Object.equals(Object object)
■ Рефлексивность
o1.equals(o1)
■ Симметричность
o1.equals(o2) == e2.equals(o1)
■ Транзитивность
o1.equals(o2) && o2.equals(o3) => o1.equals(o3)
■ Устойчивость
o1.equals(o2) не изменяется, если o1 и o2 не
изменяются
■ Обработка null
o1.equals(null) == false
Операции над множествами
■ addAll(Collection c) – объединение
множеств
■ retainAll(Collection c) – пересечение
множеств
■ containsAll(Collection c) – проверка
вхождения
■ removeAll(Collection c) – разность
множеств
Классы, реализующие Set
■ HashSet ─ множество на основе хэша
■ LinkedHashSet ─ множество на основе
хэша c сохранение порядка обхода
■ TreeSet - коллекция, которая хранит
свои элементы в виде упорядоченного
по значениям дерева.
Конструкторы HashSet
■ HashSet() ─ пустое множество
■ HashSet(Collection c) ─ элементы
коллекции
■ HashSet(int initialCapacity) ─
начальная вместимость
■ HashSet(int initialCapacity, double
loadFactor) ─ начальная
вместимость и степень заполнения
Вычисление хэшей
■ Метод Object.hashCode()
■ Устойчивость hashCode() не
изменяется, если объект не
изменяется
■ Согласованность с equals
o1.equals(o2) => o1.hashCode() ==
o2.hashCode()
Списки
■ Представляет собой неупорядоченную коллекцию, в которой
допустимы дублирующие значения
■ Классы, реализующие 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
Итератор по списку
■ Интерфейс ListIterator extends Iterator
■ Метод listIterator()
■ Предыдущий / Следующий элементы
Операции итератора по списку
■ Передвижение
○ hasNext() / hasPrevious() ─ проверка
○ next() / previous() ─ взятие элемента
○ nextIndex() / previousIndex() ─
определение индекса
■ Изменение
○ remove() ─ удаление элемента
○ set(Object e) ─ изменение элемента
○ add(Object e) ─ добавление элемента
Класс ArrayList
■ ArrayList ─ список на базе массива
■ порожден от класса AbstractList для
реализации списка, основанного на
динамически изменяющемся массиве
■ Нет методы addFirst() и addLast(), но есть
метод void add( int index, E element ) для
вставки элемента в произвольную позицию
Класс ArrayList
■ Плюсы
○ Быстрый доступ по индексу
○ Быстрая вставка и удаление элементов с
конца
■ Минусы
○ Медленная вставка и удаление
элементов
Вместимость ArrayList
■ Вместимость ─ реальное количество
элементов
■ Дополнительные методы
○ ensureCapacity(int c) ─ определение
вместимости
○ trimToSize() ─ “подгонка” вместимости
Конструкторы ArrayList
■ ArrayList() ─ пустой список
■ ArrayList(Collection c) ─ копия
коллекции
■ ArrayList(int initialCapacity) ─ пустой
список заданной вместимости
Применения ArrayList
■ “Бесконечный” массив
■ Стек
Пример использования ArrayList
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" );
list.add( null );
list.add( list.size(), s );
list.add( 0, "This");
// list.add( new Double(12.4) ); ошибка компиляции
System.out.println( list );
displayCollection( list );
}
…
Пример использования ArrayList
Результат:
[This, is, is, a, a, null, test]
The size of the Collection is : 7
This is is a a null test
Класс LinkedList
■ LinkedList ─ двусвязный список
■ Порожден от класса
AbstractSequentialList
■ Реализация связанного
двунаправленного списка – каждый
элемент ссылается на предыдущий и на
последующий элементы
■ Есть методы addFirst() и addLast()
Класс LinkedList
■ Создаётся типизированная коллекция, в которой
могут храниться только элементы типа String:
■ LinkedList<String> list = new LinkedList<String>();
■ Любая попытка внести в список ссылку на объект
другого типа приведет к ошибке компиляции:
■ list.add( new Double(12.4) );
■ Плюсы
○ Быстрое добавление и удаление элементов
■ Минусы
○ Медленный доступ по индексу
Возможности LinkedList
■ Конструкторы
○ LinkedList() ─ пустой список
○ LinkedList(Collection c) ─ копия коллекции
■ Методы
○ addFirst(Object o) – добавить в начало
списка
○ addLast(Object o) – добавить в конец списка
○ removeFirst() – удалить первый элемент
○ removeLast() – удалить последний элемент
Применения LinkedList
■ Стек
■ Очередь
■ Дек
Пример. Вывод LinkedList на
экран
Пример использования 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" );
list.add( "a" );
list.add( null );
list.addLast( s );
list.addFirst("This");
// list.add( new Double(12.4) ); ошибка компиляции
System.out.println( list );
displayCollection( list );
}
Пример. Вывод LinkedList на
экран
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() );
}
}
Результат: [This, is, is, a, a, null, test]
The size of the Collection is : 7
This is is a a null test
Очередь
Очередь
■ Очередь – хранилище элементов для
обработки
■ Интерфейс Queue
■ Свойства очередей
○ Порядок выдачи элементов
определяется конкретной реализацией
○ Очереди не могут хранить null
○ У очереди может быть ограничен
размер
Методы очередей
■ Обычные методы
○ add(Object o) – добавить элемент
■ Бросает UnsupportedOperationException
○ Object element() – вершина очереди
■ Бросает NoSuchElementException
○ Object remove() – удалить элемент из вершины
■ Бросает NoSuchElementException
■ Методы, не бросающие исключений
○ offer(Object o) – добавить элемент
○ Object peek() – вершина очереди
○ Object poll() – удалить элемент из вершины
Отображение
Отображение
■ Отображение ─ множество пар ключ-значение
при уникальности ключа
■ Интерфейс Map
Методы отображений
■ Доступ
○ get(Object k) ─ получение значение
○ put(Object k, Object v) ─ запись
○ remove(Object k) ─ удаление
■ Проверки
○ containsKey(Object k) ─ наличие ключа
○ containsValue(Object v) ─ наличие значения
■ Определения размера
○ size() ─ размер отображения
○ isEmpty() ─ проверка на пустоту
Методы отображений
■ Взятие видов
○ entrySet() ─ множество пар
○ values() ─ коллекция значений
○ keySet() ─ множество ключей
■ Массовые операции
○ putAll(Map map) ─ добавление всех
пар
Пары
■ Пара ─ ключ + значение
■ Интерфейс Map.Entry
■ Методы
○ Object getKey()
○ Object getValue()
○ setValue(Object v)
Классы HashMap и LinkedHashMap
■ HashMap ─ отображение на основе
хэшей
■ LinkedHashMap ─ отображение на
основе хэшей с сохранением
порядка обхода
Конструкторы HashMap
■ HashMap() ─ пустое отображение
■ HashMap(Map m) ─ копия
отображения
■ HashMap(int initialCapacity) ─
начальная вместимость
■ HashMap (int initialCapacity, int
loadFactor) ─ начальная
вместимость и степень заполнения
Вопросы?

More Related Content

What's hot

Лекция 3 Элементарные структуры данных Часть 1
Лекция 3 Элементарные структуры данных Часть 1Лекция 3 Элементарные структуры данных Часть 1
Лекция 3 Элементарные структуры данных Часть 1simple_people
 
Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"LogeekNightUkraine
 
9. java lecture library
9. java lecture library9. java lecture library
9. java lecture libraryMERA_school
 
10. java lecture generics&collections
10. java lecture generics&collections10. java lecture generics&collections
10. java lecture generics&collectionsMERA_school
 
C#. От основ к эффективному коду
C#. От основ к эффективному кодуC#. От основ к эффективному коду
C#. От основ к эффективному кодуVasiliy Deynega
 
Олег Алистратов — Сортировка списков в Perl и Python
Олег Алистратов — Сортировка списков в Perl и PythonОлег Алистратов — Сортировка списков в Perl и Python
Олег Алистратов — Сортировка списков в Perl и PythonYandex
 
AlgoCollections (RUS)
AlgoCollections (RUS)AlgoCollections (RUS)
AlgoCollections (RUS)Anton Bukov
 
Магия метаклассов
Магия метаклассовМагия метаклассов
Магия метаклассовAndrey Zakharevich
 
Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееdelimitry
 
8. java lecture threads
8. java lecture threads8. java lecture threads
8. java lecture threadsMERA_school
 
Функциональное программирование на F#
Функциональное программирование на F#Функциональное программирование на F#
Функциональное программирование на F#akrakovetsky
 
3. java lecture classes
3. java lecture classes3. java lecture classes
3. java lecture classesMERA_school
 
Обработка текста на Haskell - это просто!
Обработка текста на Haskell - это просто!Обработка текста на Haskell - это просто!
Обработка текста на Haskell - это просто!Mike Potanin
 

What's hot (18)

Lecture 2
Lecture 2Lecture 2
Lecture 2
 
Лекция 3 Элементарные структуры данных Часть 1
Лекция 3 Элементарные структуры данных Часть 1Лекция 3 Элементарные структуры данных Часть 1
Лекция 3 Элементарные структуры данных Часть 1
 
Scala on android
Scala on androidScala on android
Scala on android
 
Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"
 
Scala - my path
Scala - my pathScala - my path
Scala - my path
 
9. java lecture library
9. java lecture library9. java lecture library
9. java lecture library
 
10. java lecture generics&collections
10. java lecture generics&collections10. java lecture generics&collections
10. java lecture generics&collections
 
C#. От основ к эффективному коду
C#. От основ к эффективному кодуC#. От основ к эффективному коду
C#. От основ к эффективному коду
 
Scala
ScalaScala
Scala
 
Олег Алистратов — Сортировка списков в Perl и Python
Олег Алистратов — Сортировка списков в Perl и PythonОлег Алистратов — Сортировка списков в Perl и Python
Олег Алистратов — Сортировка списков в Perl и Python
 
AlgoCollections (RUS)
AlgoCollections (RUS)AlgoCollections (RUS)
AlgoCollections (RUS)
 
Магия метаклассов
Магия метаклассовМагия метаклассов
Магия метаклассов
 
Xtend
XtendXtend
Xtend
 
Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущее
 
8. java lecture threads
8. java lecture threads8. java lecture threads
8. java lecture threads
 
Функциональное программирование на F#
Функциональное программирование на F#Функциональное программирование на F#
Функциональное программирование на F#
 
3. java lecture classes
3. java lecture classes3. java lecture classes
3. java lecture classes
 
Обработка текста на Haskell - это просто!
Обработка текста на Haskell - это просто!Обработка текста на Haskell - это просто!
Обработка текста на Haskell - это просто!
 

Similar to Java Core. Lecture# 4. Collections.

C# Desktop. Занятие 05.
C# Desktop. Занятие 05.C# Desktop. Занятие 05.
C# Desktop. Занятие 05.Igor Shkulipa
 
04 Стандартная Библиотека
04 Стандартная Библиотека04 Стандартная Библиотека
04 Стандартная Библиотекаphearnot
 
Msu.Center.Lectures.J04 Std Libs
Msu.Center.Lectures.J04 Std LibsMsu.Center.Lectures.J04 Std Libs
Msu.Center.Lectures.J04 Std Libsolegol
 
модуль 13 использование коллекций
модуль 13 использование коллекциймодуль 13 использование коллекций
модуль 13 использование коллекцийYevgeniy Gertsen
 
Алгоритмы и структуры данных осень 2013 лекция 2
Алгоритмы и структуры данных осень 2013 лекция 2Алгоритмы и структуры данных осень 2013 лекция 2
Алгоритмы и структуры данных осень 2013 лекция 2Technopark
 
C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.Igor Shkulipa
 
Алгоритмы и структуры данных весна 2014 лекция 2
Алгоритмы и структуры данных весна 2014 лекция 2Алгоритмы и структуры данных весна 2014 лекция 2
Алгоритмы и структуры данных весна 2014 лекция 2Technopark
 
Массивы в Java
Массивы в JavaМассивы в Java
Массивы в Javametaform
 
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...JetBrains Russia
 
Java осень 2013 лекция 2
Java осень 2013 лекция 2Java осень 2013 лекция 2
Java осень 2013 лекция 2Technopark
 
05 - Java. Collections Framework и Generics
05 - Java. Collections Framework и Generics05 - Java. Collections Framework и Generics
05 - Java. Collections Framework и GenericsRoman Brovko
 
Android - 03 - Multithreading, Collections
Android - 03 - Multithreading, CollectionsAndroid - 03 - Multithreading, Collections
Android - 03 - Multithreading, CollectionsNoveo
 
Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Dima Dzuba
 
C++ Базовый. Занятие 05.
C++ Базовый. Занятие 05.C++ Базовый. Занятие 05.
C++ Базовый. Занятие 05.Igor Shkulipa
 
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...CocoaHeads
 
Персистентные структуры данных и архитектура
Персистентные структуры данных и архитектураПерсистентные структуры данных и архитектура
Персистентные структуры данных и архитектураVadim Shalts
 

Similar to Java Core. Lecture# 4. Collections. (20)

C# Desktop. Занятие 05.
C# Desktop. Занятие 05.C# Desktop. Занятие 05.
C# Desktop. Занятие 05.
 
04 Стандартная Библиотека
04 Стандартная Библиотека04 Стандартная Библиотека
04 Стандартная Библиотека
 
Msu.Center.Lectures.J04 Std Libs
Msu.Center.Lectures.J04 Std LibsMsu.Center.Lectures.J04 Std Libs
Msu.Center.Lectures.J04 Std Libs
 
модуль 13 использование коллекций
модуль 13 использование коллекциймодуль 13 использование коллекций
модуль 13 использование коллекций
 
Алгоритмы и структуры данных осень 2013 лекция 2
Алгоритмы и структуры данных осень 2013 лекция 2Алгоритмы и структуры данных осень 2013 лекция 2
Алгоритмы и структуры данных осень 2013 лекция 2
 
C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.
 
Алгоритмы и структуры данных весна 2014 лекция 2
Алгоритмы и структуры данных весна 2014 лекция 2Алгоритмы и структуры данных весна 2014 лекция 2
Алгоритмы и структуры данных весна 2014 лекция 2
 
Массивы в Java
Массивы в JavaМассивы в Java
Массивы в Java
 
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...
 
Java осень 2013 лекция 2
Java осень 2013 лекция 2Java осень 2013 лекция 2
Java осень 2013 лекция 2
 
Lec 3
Lec 3Lec 3
Lec 3
 
List - списки
List - списки List - списки
List - списки
 
05 - Java. Collections Framework и Generics
05 - Java. Collections Framework и Generics05 - Java. Collections Framework и Generics
05 - Java. Collections Framework и Generics
 
Обзор Ruby
Обзор RubyОбзор Ruby
Обзор Ruby
 
Android - 03 - Multithreading, Collections
Android - 03 - Multithreading, CollectionsAndroid - 03 - Multithreading, Collections
Android - 03 - Multithreading, Collections
 
Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10
 
C++ Базовый. Занятие 05.
C++ Базовый. Занятие 05.C++ Базовый. Занятие 05.
C++ Базовый. Занятие 05.
 
Рекурсия. Поиск
Рекурсия. ПоискРекурсия. Поиск
Рекурсия. Поиск
 
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
 
Персистентные структуры данных и архитектура
Персистентные структуры данных и архитектураПерсистентные структуры данных и архитектура
Персистентные структуры данных и архитектура
 

More from Anton Moiseenko

Design of Information Systems. Lecture #1. XML
Design of Information Systems. Lecture #1. XMLDesign of Information Systems. Lecture #1. XML
Design of Information Systems. Lecture #1. XMLAnton Moiseenko
 
Java core-lect6-part3-annotation.ppt
Java core-lect6-part3-annotation.pptJava core-lect6-part3-annotation.ppt
Java core-lect6-part3-annotation.pptAnton Moiseenko
 
Java core-lect6-part2-reflection-api.ppt
Java core-lect6-part2-reflection-api.pptJava core-lect6-part2-reflection-api.ppt
Java core-lect6-part2-reflection-api.pptAnton Moiseenko
 
Java Core. Lecture#6. Part#1. Generics.
Java Core. Lecture#6. Part#1. Generics.Java Core. Lecture#6. Part#1. Generics.
Java Core. Lecture#6. Part#1. Generics.Anton Moiseenko
 
Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.Anton Moiseenko
 
Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.Anton Moiseenko
 
Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.Anton Moiseenko
 
Java Core. Lecture# 3. Part# 1. Abstract classes.
Java Core. Lecture# 3. Part# 1. Abstract classes.Java Core. Lecture# 3. Part# 1. Abstract classes.
Java Core. Lecture# 3. Part# 1. Abstract classes.Anton Moiseenko
 
Java Core. Lecture# 2. Classes & objects.
Java Core. Lecture# 2. Classes & objects.Java Core. Lecture# 2. Classes & objects.
Java Core. Lecture# 2. Classes & objects.Anton Moiseenko
 
Java Core. Lecture# 1. Intro
Java Core. Lecture# 1. IntroJava Core. Lecture# 1. Intro
Java Core. Lecture# 1. IntroAnton Moiseenko
 

More from Anton Moiseenko (10)

Design of Information Systems. Lecture #1. XML
Design of Information Systems. Lecture #1. XMLDesign of Information Systems. Lecture #1. XML
Design of Information Systems. Lecture #1. XML
 
Java core-lect6-part3-annotation.ppt
Java core-lect6-part3-annotation.pptJava core-lect6-part3-annotation.ppt
Java core-lect6-part3-annotation.ppt
 
Java core-lect6-part2-reflection-api.ppt
Java core-lect6-part2-reflection-api.pptJava core-lect6-part2-reflection-api.ppt
Java core-lect6-part2-reflection-api.ppt
 
Java Core. Lecture#6. Part#1. Generics.
Java Core. Lecture#6. Part#1. Generics.Java Core. Lecture#6. Part#1. Generics.
Java Core. Lecture#6. Part#1. Generics.
 
Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.
 
Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.
 
Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.
 
Java Core. Lecture# 3. Part# 1. Abstract classes.
Java Core. Lecture# 3. Part# 1. Abstract classes.Java Core. Lecture# 3. Part# 1. Abstract classes.
Java Core. Lecture# 3. Part# 1. Abstract classes.
 
Java Core. Lecture# 2. Classes & objects.
Java Core. Lecture# 2. Classes & objects.Java Core. Lecture# 2. Classes & objects.
Java Core. Lecture# 2. Classes & objects.
 
Java Core. Lecture# 1. Intro
Java Core. Lecture# 1. IntroJava Core. Lecture# 1. Intro
Java Core. Lecture# 1. Intro
 

Java Core. Lecture# 4. Collections.

  • 1. Язык программирования JAVA Лекция# 4 Структуры данных в Java Моисеенко Антон canggu@mail.ru СПГУАП Кафедра Информационно-Сетевых Технологий
  • 2. Содержание курса 1. Коллекции 2. Множества 3. Списки 4. Очереди и деки 5. Отображения 6. Заключение
  • 3. Коллекции ■ Коллекция ─ неупорядоченный набор элементов ■ Интерфейс Collection
  • 4. Коллекции в Java ■ «Платформы Java содержат набор готовых классов, реализующих механизмы работы со структурами данных ■ Такие классы называются коллекциями (collections) ■ Хотя обработка массивов происходит быстрее, в ряде случаев требуется использовать коллекции
  • 5. Предпосылки использования ■ Необходимость динамического изменения размера структуры данных ■ Динамическое добавление или удаление элемента ■ Хранение разнотипных элементов (объектов) ■ Извлечение и манипуляция данными из БД ■ Хранение и работа со сложными структурами данных (деревьями, списками, стеками, хеш- таблицами и т.д.) и т.п.
  • 6. Базовые интерфейсы и классы ■ Интерфейс Collection предназначен для хранения однородных элементов. Его расширяют интерфейсы: ■ List – список ■ Set – множество ■ Queue – очередь ■ Интерфейс Map предназначен для создания коллекций, хранящих пары «ключ-значение». Его реализуют классы: ■ HashMap ■ IdentityHashMap ■ TreeMap
  • 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. Методы интерфейса Collection(продолжение) ■ boolean retainAll(Collection<?> coll) – Оставляет в коллекции только те из входящих в неё элементов, которые входят в коллекции coll; возвращает true, если исходная коллекция изменена. ■ int size() – Возвращает количество элементов в коллекции. ■ Object[] toArray() – Возвращает массив, содержащий все элементы данной коллекции.
  • 12. Методы интерфейса Collection(продолжение) ■ <T> T[] toArray(T[] a) – Возвращает массив, содержащий все элементы данной коллекции; тип возвращаемого массива таков, как тип заданного массива. Если коллекция вмещается в заданный массив, она возвращается в массиве. В противном случае размещается массив с типом времени выполнения для заданного массива и размером равным размеру коллекции. ■ String toString() – Возвращает строку со списком элементов коллекции в квадратных скобках, через запятую и пробел
  • 15. Специфика хранения элементов ■ Коллекции могут хранить только ссылки на объекты. ■ Примитивные типы могут быть сохранены в коллекции и извлечены из неё за счёт автоматических операций упаковки и распаковки в классы-оболочки (Boxing и Unboxing, с Java SE 5) ■ Начиная с версии Java SE 5, коллекции стали типизированными и при их создании рекомендуется указывать тип объектов, кот. будут храниться в ней ArrayList<String> arr = new ArrayList<String>();
  • 16. Пример. Вывод коллекции на экран public void dump(Collection c) { for (Iterator i = c.iterator(); i.hasNext(); ) { String word = (String) i.next(); System.out.print(word + ", "); } System.out.println(); }
  • 17. Преобразование в массив ■ Object[] toArray() ─ создает новый массив ■ Object[] toArray(Object[] a) ─ использует переданный массив ■ Пример использования String[] i = (String[])c.toArray(new String[c.size()]);
  • 18. Итераторы ■ Итератор ─ обход коллекции ■ Интерфейс Iterator ■ Метод Iterator Collection.iterator()
  • 19. Методы итераторов ■ hasNext() ─ определение наличия следующего элемента ■ next() ─ взятие следующего элемента ■ remove() ─ удаление элемента ■ Исключения ○ NoSuchElementException ─ бросается при достижении конца коллекции ○ ConcurrentModificationException ─ бросается при изменении коллекции
  • 20. Применение итераторов ■ Обход коллекции for(Iterator i = c.iterator(); i.hasNext(); ) { Object element = i.next(); ... } ■ Фильтрование коллекции for(Iterator i = c.iterator(); i.hasNext(); ) { if (!((String)i.next()).equals(“Bla-bla”)) i.remove(); }
  • 21. Пример работы с итераторами List compon = Arrays.asList(this.getComponents()); for (Iterator iter=compon.iterator(); iter.hasNext(); ) { Object elem = (Object) iter.next(); System.out.println(“Компонент: ”, elem.toString(); }
  • 22. Множества ■ Множество ─ коллекция без повторяющихся элементов ■ Интерфейс Set
  • 24. Сравнение элементов ■ Метод Object.equals(Object object) ■ Рефлексивность o1.equals(o1) ■ Симметричность o1.equals(o2) == e2.equals(o1) ■ Транзитивность o1.equals(o2) && o2.equals(o3) => o1.equals(o3) ■ Устойчивость o1.equals(o2) не изменяется, если o1 и o2 не изменяются ■ Обработка null o1.equals(null) == false
  • 25. Операции над множествами ■ addAll(Collection c) – объединение множеств ■ retainAll(Collection c) – пересечение множеств ■ containsAll(Collection c) – проверка вхождения ■ removeAll(Collection c) – разность множеств
  • 26. Классы, реализующие Set ■ HashSet ─ множество на основе хэша ■ LinkedHashSet ─ множество на основе хэша c сохранение порядка обхода ■ TreeSet - коллекция, которая хранит свои элементы в виде упорядоченного по значениям дерева.
  • 27. Конструкторы HashSet ■ HashSet() ─ пустое множество ■ HashSet(Collection c) ─ элементы коллекции ■ HashSet(int initialCapacity) ─ начальная вместимость ■ HashSet(int initialCapacity, double loadFactor) ─ начальная вместимость и степень заполнения
  • 28. Вычисление хэшей ■ Метод Object.hashCode() ■ Устойчивость hashCode() не изменяется, если объект не изменяется ■ Согласованность с equals o1.equals(o2) => o1.hashCode() == o2.hashCode()
  • 29. Списки ■ Представляет собой неупорядоченную коллекцию, в которой допустимы дублирующие значения ■ Классы, реализующие List: ■ LinkedList – связанный список, можно вставлять элементы только в начало и конец ■ ArrayList – динамический массив с произвольной вставкой и удалением элементов ■ Элементы, находящиеся в коллекции List проиндексированы
  • 31. Методы интерфейса List ■ <T>Elem get(int i) – Возвращает ссылку на элемент списка под номером i ■ int indexOf(<T> obj) – Возвращает индекс (номер) элемента obj. Если объект не найден, возвращает - 1. ■ ListIterator listIterator([int i]) – Возвращает итератор списка с дополнительными возможностями (по сравнению с Iterator). Если указан параметр i, то итератор будет позиционирован на элемент с индексом i
  • 32. Методы интерфейса List ■ boolean remove(int i) – удаляет из списка элемент с номером i. ■ set(int i, <T> obj) – заменяет элемент с номером i на указанный элемент obj ■ List subList(i1, i2) – возвращает ссылку на подсписок, содержащий элементы исходного списка с номерами от i1 до i2
  • 33. Методы класса Collections ■ Collections.addAll(c,e1,e2,…,en) – добавляет в коллекцию c произвольное число элементов e1, …, en ■ frequency(c, obj) – возвращает число вхождений элемента obj в коллекцию с ■ reverse(list) – обращает порядок следования элементов в списке list ■ sort(list) – сортирует список в порядке возрастания элементов. Сравнение идёт с помощью вызова метода e1.compareTo(e2) для элементов списка e1, e2
  • 34. Итератор по списку ■ Интерфейс ListIterator extends Iterator ■ Метод listIterator() ■ Предыдущий / Следующий элементы
  • 35. Операции итератора по списку ■ Передвижение ○ hasNext() / hasPrevious() ─ проверка ○ next() / previous() ─ взятие элемента ○ nextIndex() / previousIndex() ─ определение индекса ■ Изменение ○ remove() ─ удаление элемента ○ set(Object e) ─ изменение элемента ○ add(Object e) ─ добавление элемента
  • 36. Класс ArrayList ■ ArrayList ─ список на базе массива ■ порожден от класса AbstractList для реализации списка, основанного на динамически изменяющемся массиве ■ Нет методы addFirst() и addLast(), но есть метод void add( int index, E element ) для вставки элемента в произвольную позицию
  • 37. Класс ArrayList ■ Плюсы ○ Быстрый доступ по индексу ○ Быстрая вставка и удаление элементов с конца ■ Минусы ○ Медленная вставка и удаление элементов
  • 38. Вместимость ArrayList ■ Вместимость ─ реальное количество элементов ■ Дополнительные методы ○ ensureCapacity(int c) ─ определение вместимости ○ trimToSize() ─ “подгонка” вместимости
  • 39. Конструкторы ArrayList ■ ArrayList() ─ пустой список ■ ArrayList(Collection c) ─ копия коллекции ■ ArrayList(int initialCapacity) ─ пустой список заданной вместимости
  • 41. Пример использования ArrayList 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" ); list.add( null ); list.add( list.size(), s ); list.add( 0, "This"); // list.add( new Double(12.4) ); ошибка компиляции System.out.println( list ); displayCollection( list ); } …
  • 42. Пример использования ArrayList Результат: [This, is, is, a, a, null, test] The size of the Collection is : 7 This is is a a null test
  • 43. Класс LinkedList ■ LinkedList ─ двусвязный список ■ Порожден от класса AbstractSequentialList ■ Реализация связанного двунаправленного списка – каждый элемент ссылается на предыдущий и на последующий элементы ■ Есть методы addFirst() и addLast()
  • 44. Класс LinkedList ■ Создаётся типизированная коллекция, в которой могут храниться только элементы типа String: ■ LinkedList<String> list = new LinkedList<String>(); ■ Любая попытка внести в список ссылку на объект другого типа приведет к ошибке компиляции: ■ list.add( new Double(12.4) ); ■ Плюсы ○ Быстрое добавление и удаление элементов ■ Минусы ○ Медленный доступ по индексу
  • 45. Возможности LinkedList ■ Конструкторы ○ LinkedList() ─ пустой список ○ LinkedList(Collection c) ─ копия коллекции ■ Методы ○ addFirst(Object o) – добавить в начало списка ○ addLast(Object o) – добавить в конец списка ○ removeFirst() – удалить первый элемент ○ removeLast() – удалить последний элемент
  • 47. Пример. Вывод LinkedList на экран Пример использования 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" ); list.add( "a" ); list.add( null ); list.addLast( s ); list.addFirst("This"); // list.add( new Double(12.4) ); ошибка компиляции System.out.println( list ); displayCollection( list ); }
  • 48. Пример. Вывод LinkedList на экран 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() ); } } Результат: [This, is, is, a, a, null, test] The size of the Collection is : 7 This is is a a null test
  • 50. Очередь ■ Очередь – хранилище элементов для обработки ■ Интерфейс Queue ■ Свойства очередей ○ Порядок выдачи элементов определяется конкретной реализацией ○ Очереди не могут хранить null ○ У очереди может быть ограничен размер
  • 51. Методы очередей ■ Обычные методы ○ add(Object o) – добавить элемент ■ Бросает UnsupportedOperationException ○ Object element() – вершина очереди ■ Бросает NoSuchElementException ○ Object remove() – удалить элемент из вершины ■ Бросает NoSuchElementException ■ Методы, не бросающие исключений ○ offer(Object o) – добавить элемент ○ Object peek() – вершина очереди ○ Object poll() – удалить элемент из вершины
  • 53. Отображение ■ Отображение ─ множество пар ключ-значение при уникальности ключа ■ Интерфейс Map
  • 54. Методы отображений ■ Доступ ○ get(Object k) ─ получение значение ○ put(Object k, Object v) ─ запись ○ remove(Object k) ─ удаление ■ Проверки ○ containsKey(Object k) ─ наличие ключа ○ containsValue(Object v) ─ наличие значения ■ Определения размера ○ size() ─ размер отображения ○ isEmpty() ─ проверка на пустоту
  • 55. Методы отображений ■ Взятие видов ○ entrySet() ─ множество пар ○ values() ─ коллекция значений ○ keySet() ─ множество ключей ■ Массовые операции ○ putAll(Map map) ─ добавление всех пар
  • 56. Пары ■ Пара ─ ключ + значение ■ Интерфейс Map.Entry ■ Методы ○ Object getKey() ○ Object getValue() ○ setValue(Object v)
  • 57. Классы HashMap и LinkedHashMap ■ HashMap ─ отображение на основе хэшей ■ LinkedHashMap ─ отображение на основе хэшей с сохранением порядка обхода
  • 58. Конструкторы HashMap ■ HashMap() ─ пустое отображение ■ HashMap(Map m) ─ копия отображения ■ HashMap(int initialCapacity) ─ начальная вместимость ■ HashMap (int initialCapacity, int loadFactor) ─ начальная вместимость и степень заполнения