2012 10 24_java_lecture07

33
Стандартная библиотека Java: пакет java.util Алексей Владыкин 24 октября 2012 Алексей Владыкин java.util 24 октября 2012 1 / 33

Upload: cs-center

Post on 26-May-2015

3.021 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 2012 10 24_java_lecture07

Стандартная библиотека Java:пакет java.util

Алексей Владыкин

24 октября 2012

Алексей Владыкин java.util 24 октября 2012 1 / 33

Page 2: 2012 10 24_java_lecture07

1 Collections Framework

2 Generics

3 Другие классы java.util

Алексей Владыкин java.util 24 октября 2012 2 / 33

Page 3: 2012 10 24_java_lecture07

Collections Framework

1 Collections Framework

2 Generics

3 Другие классы java.util

Алексей Владыкин java.util 24 октября 2012 3 / 33

Page 4: 2012 10 24_java_lecture07

Collections Framework Общие сведения

Что такое коллекции

Разнообразные контейнеры для хранения наборов объектов

Предоставляют значительно больше возможностей, чем массивы

В первую очередь, возможность добавления и удаления элементовс динамическим изменением размера коллекции

В отличие от массивов, могут хранить только объекты, но непримитивные типы (однако можно использовать классы-обертки)

Алексей Владыкин java.util 24 октября 2012 4 / 33

Page 5: 2012 10 24_java_lecture07

Collections Framework Общие сведения

Разновидности коллекций

java.util.List — список(фиксированный порядок, доступ к элементам по индексу)

java.util.Set — множество(каждый элемент встречается не более одного раза)

java.util.Map — ассоциативный массив(набор пар «ключ–значение»)

Алексей Владыкин java.util 24 октября 2012 5 / 33

Page 6: 2012 10 24_java_lecture07

Collections Framework Общие сведения

java.util.Collection

Базовый интерфейс для коллекций

Основные операции:int size()boolean isEmpty()boolean contains(Object o) — использует equalsboolean add(E e)boolean remove(Object o)void clear()

Алексей Владыкин java.util 24 октября 2012 6 / 33

Page 7: 2012 10 24_java_lecture07

Collections Framework Общие сведения

java.util.Iterator

Единообразный способ обхода элементов коллекции

Операции:boolean hasNext()E next()void remove()

По возможности следует использовать цикл foreach вместоявной работы с итератором

Алексей Владыкин java.util 24 октября 2012 7 / 33

Page 8: 2012 10 24_java_lecture07

Collections Framework Списки

java.util.List

Фиксированный порядокДоступ к элементам по индексу

Операции:E get(int index)E set(int index, E element)void add(int index, E element)E remove(int index)int indexOf(Object o)int lastIndexOf(Object o)List<E> subList(int fromIndex, int toIndex)

Алексей Владыкин java.util 24 октября 2012 8 / 33

Page 9: 2012 10 24_java_lecture07

Collections Framework Списки

java.util.ArrayList

Реализация списка на основе массиваСпецифические операции:

void ensureCapacity(int capacity)void trimToSize()

Эффективный доступ к элементу по индексуВставка/удаление по индексу имеет линейную трудоемкость

List <String > words = new ArrayList <>();words.add("one");words.set(0, "two");words.add(0, "three");words.remove (1);

Алексей Владыкин java.util 24 октября 2012 9 / 33

Page 10: 2012 10 24_java_lecture07

Collections Framework Списки

java.util.LinkedList

Реализация списка на основе двусвязного списка

Эффективные вставка и удаление элемента в начале и в концеспискаДоступ к элементу по индексу имеет линейную трудоемкость

List <String > words = new LinkedList <>();words.add("one");words.add("two");words.add("three");words.subList(1, 3). clear ();

Алексей Владыкин java.util 24 октября 2012 10 / 33

Page 11: 2012 10 24_java_lecture07

Collections Framework Списки

Сравнение коллекций

Метод boolean equals(Object obj)

Списки равны, если содержат равные элементы в одинаковомпорядке

Множества равны, если содержат одинаковые элементы

Ассоциативные массивы равны, если содержат одинаковые пары«ключ-значение»

Алексей Владыкин java.util 24 октября 2012 11 / 33

Page 12: 2012 10 24_java_lecture07

Collections Framework Множества

java.util.Set

Каждый элемент встречается не более одного раза

Не добавляет новых операций к тем, что естьв java.util.Collection

Но гарантирует, что при добавлении элементов дубликатыне появятся

Алексей Владыкин java.util 24 октября 2012 12 / 33

Page 13: 2012 10 24_java_lecture07

Collections Framework Множества

java.util.HashSet

Реализация множества на основе хеш-таблицыПорядок обхода элементов непредсказуем

Set <String > words = new HashSet <>();words.add("one");words.add("one");words.add("two");words.add("two");

Алексей Владыкин java.util 24 октября 2012 13 / 33

Page 14: 2012 10 24_java_lecture07

Collections Framework Множества

java.util.LinkedHashSet

Реализация множества на основе хеш-таблицыПорядок обхода элементов определяется порядком вставки

Set <String > words = new LinkedHashSet <>();words.add("one");words.add("one");words.add("two");words.add("two");

Алексей Владыкин java.util 24 октября 2012 14 / 33

Page 15: 2012 10 24_java_lecture07

Collections Framework Множества

Специфика хеш-таблиц

Контракт equals() и hashCode():если a.equals(b), то a.hashCode()==b.hashCode()

Пока объект находится в хеш-таблице, нельзя менять значение егополей, влияющих на значение hashCode()

Алексей Владыкин java.util 24 октября 2012 15 / 33

Page 16: 2012 10 24_java_lecture07

Collections Framework Множества

java.util.TreeSet

Реализация множества на основе дерева поискаЭлементы хранятся отсортированными

SortedSet <String > words = new TreeSet <>();words.add("aaa");words.add("bbb");words.add("ccc");words.headSet("bbb").clear ();

Алексей Владыкин java.util 24 октября 2012 16 / 33

Page 17: 2012 10 24_java_lecture07

Collections Framework Множества

Специфика деревьев поиска

Порядок элементов определяется:объектом типа java.util.Comparatorс методом int compare(T o1, T o2)методом элементов int compareTo(T o) (элементы должныреализовать интерфейс java.lang.Comparable)

Контракт equals() и compareTo():a.equals(b) == (a.compareTo(b) == 0)

Алексей Владыкин java.util 24 октября 2012 17 / 33

Page 18: 2012 10 24_java_lecture07

Collections Framework Множества

Удаление дубликатов из коллекции

List <String > list = new ArrayList <>();list.add("aaa");list.add("aaa");list.add("bbb");list.add("aaa");

Set <String > set =new LinkedHashSet <>(list);

List <String > listWithoutDups =new ArrayList <>(set);

Алексей Владыкин java.util 24 октября 2012 18 / 33

Page 19: 2012 10 24_java_lecture07

Collections Framework Ассоциативные массивы

java.util.Map

Набор пар «ключ–значение»Не наследует java.util.Collection

Основные операции:int size()boolean isEmpty()V get(Object key)V put(K key, V value)V remove(Object key)boolean containsKey(Object key)boolean containsValue(Object value)Set<K> keySet()Collection<V> values()Set<Map.Entry<K, V>> entrySet()

Алексей Владыкин java.util 24 октября 2012 19 / 33

Page 20: 2012 10 24_java_lecture07

Collections Framework Ассоциативные массивы

java.util.HashMap

Реализация ассоциативного массива на основе хеш-таблицыПорядок обхода элементов непредсказуемЕсть java.util.LinkedHashMap

Map <String , String > dictionary = new HashMap <>();dictionary.put("foo", "bar");dictionary.put("bar", "baz");dictionary.remove("bar");

Алексей Владыкин java.util 24 октября 2012 20 / 33

Page 21: 2012 10 24_java_lecture07

Collections Framework Ассоциативные массивы

java.util.TreeMap

Реализация ассоциативного массива на основе дерева поискаЭлементы хранятся отсортированными по ключу

SortedMap <String , String > dictionary =new TreeMap <>();

dictionary.put("foo", "bar");dictionary.put("bar", "baz");dictionary.subMap("bar", "foo").clear ();

Алексей Владыкин java.util 24 октября 2012 21 / 33

Page 22: 2012 10 24_java_lecture07

Collections Framework Ассоциативные массивы

Обход ассоциативного массива

Map <A, B> map = new HashMap <>();

for (A key : map.keySet ()) { ... }

for (B value : map.values ()) { ... }

for (Map.Entry <A, B> entry : map.entrySet ()) {entry.getKey ();entry.getValue ();

}

Алексей Владыкин java.util 24 октября 2012 22 / 33

Page 23: 2012 10 24_java_lecture07

Collections Framework

java.util.Collections

Методы для сортировки, поиска, определения минимума имаксимума

Защита коллекций от изменения

Экземпляры пустых коллекций

Алексей Владыкин java.util 24 октября 2012 23 / 33

Page 24: 2012 10 24_java_lecture07

Collections Framework

Устаревшие классы

java.util.Vector

java.util.Stack

java.util.Dictionary

java.util.Hashtable

Алексей Владыкин java.util 24 октября 2012 24 / 33

Page 25: 2012 10 24_java_lecture07

Generics

1 Collections Framework

2 Generics

3 Другие классы java.util

Алексей Владыкин java.util 24 октября 2012 25 / 33

Page 26: 2012 10 24_java_lecture07

Generics

Возможность параметризовать класс или метод некоторым типом

Появилась в Java 5

Напоминает шаблоны в C++, но есть большие отличия

Нельзя использовать в качестве параметра примитивные типыили значения примитивных типов

Алексей Владыкин java.util 24 октября 2012 26 / 33

Page 27: 2012 10 24_java_lecture07

Generics

Параметризованный класс

public class GenericClass <T> {

private T ref;

public T getRef () {return ref;

}

public void setRef(T ref) {this.ref = ref;

}}

Алексей Владыкин java.util 24 октября 2012 27 / 33

Page 28: 2012 10 24_java_lecture07

Generics

Параметризованный метод

public class ClassWithGenericMethod {

public static <T extends Comparable <T>>T min(T a, T b) {

return a.compareTo(b) <= 0 ? a : b;}

public static <T extends Comparable <T>>T max(T a, T b) {

return 0 <= a.compareTo(b) ? a : b;}

}

Алексей Владыкин java.util 24 октября 2012 28 / 33

Page 29: 2012 10 24_java_lecture07

Generics

Ограничения

По имени параметра нельзя создать экземпляр или массив:new T(); new T[];

Если class Child extends Parent, то:

Parent parent = new Child (); // OKParent [] parentArray = new Child []; // OK

List <Parent > list =new ArrayList <Child >(); // not OK!

List <? extends Parent > list2 =new ArrayList <Child >(); // OK

Алексей Владыкин java.util 24 октября 2012 29 / 33

Page 30: 2012 10 24_java_lecture07

Generics

Autoboxing

Автоматическая упаковка примитивных типов в обертки ираспаковка обратно

List <Integer > list = new ArrayList <>();for (int i = 0; i < 10; ++i) {

list.add(i);}for (int i = 0; i < 10; ++i) {

list.remove(i); // ooops}

Алексей Владыкин java.util 24 октября 2012 30 / 33

Page 31: 2012 10 24_java_lecture07

Другие классы java.util

1 Collections Framework

2 Generics

3 Другие классы java.util

Алексей Владыкин java.util 24 октября 2012 31 / 33

Page 32: 2012 10 24_java_lecture07

Другие классы java.util

java.util.Arrays

java.util.Objects

java.util.Date

java.util.Calendar

java.util.Random

Алексей Владыкин java.util 24 октября 2012 32 / 33

Page 33: 2012 10 24_java_lecture07

Что сегодня узнали

Можно хранить наборы объектов не только в массивах, но и вболее гибких и функциональных коллекциях

В стандартной библиотеке Java есть списки, множества иассоциативные массивы

Работа с коллекциями стала намного удобнее с появлениемGeneric’ов в Java 5

Алексей Владыкин java.util 24 октября 2012 33 / 33