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
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() );
}
}
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 );
}
. . .