Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы к коллоквиуму.docx
Скачиваний:
2
Добавлен:
17.11.2018
Размер:
49.95 Кб
Скачать

Компараторы:

Некоторые коллекции и алгоритмы требуют, чтобы на множестве элементов, из которых состоит коллекция или карта было задано отношение порядка. Есть два способа его задать:

1) Элементы реализуют интерфейс Comparable. Такой порядок элементов называют натуральным (natural). Необходимо реализовать операцию compareTo.

2) Так как не всегда приходится рабоать с типами, реализующими Comparable, причем именно так, как необходимо, можно реализовать Comparator для данного типа и воспользоваться им в коллекциях или алгоритмах. Comparator сравнивает два объекта выбранного типа, между собой. Необходимо реализовать операцию compare.

Метод compare/compareTo должен вернуть отрицательное, 0 или положительное число, если первый (в случае compareTo – this) объект меньше, равен или больше второго (в случае compareTo – переданного в метод).

Операция compare/compareTo, должна сочитаться с операцией equals: для любых двух объектов e1 и e2 должно выполняться e1.equals(e2) == (compare(e1, e2) == 0) и e1.equals(e2) == (e1.compareTo(e1) == 0).

Операция обязана задавать отношение порядка:

(антисимметричность)

(транзитивность)

(рефлективность)

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

Также интерфейс comparator «предлагает» реализовать метод equals для самого компаратора. В том случае, если легко проверить, задает ли точно такое же отношение порядка, переданный компаратор или все компараторы класса задают одно и то же отношение порядка, это может увеличить быстродействие.

  1. Интерфейсы и классы карт.

Интерфейсы:

Map – карта, сопоставляющая ключам значения. Ключи должны быть уникальны, значения – не должны, то есть ключи представлют собой Set, который может быть получен с помощью метода keySet, значения представляют собой Collection, который может быть получен с помощью метода values. Множество пар можно получить с помощью метода entrySet, который вернет множество объектов Map.Entry. Метод put позволяет положить в карту значение (старое значение будет возвращено методом и удалено из множества), метод get позволяет получить значение, remove – удалить значение. Если карта не содержала значения по выбранному ключу – будет возвращено null.

SortedMap extends Map – множество ключей карты отсортировано. Позволяет получить компаратор, получить части карты и получить первый и последний элементы.

NavigableMap extends SortedMap – методы higherKey, higherEntry, lowerKey и lowerEntry предоставляют навигацию по карте. Метод navigableKeySet вернет NavigableSet.

ConcurrentMap – карта для многопоточного доступа, предоставляет методы putIfAbsent, remove, replace, replace изменяющие карту в зависимости не только от ключа, но и от значения по ключу.

ConcurrentNavigableMap – объединение ConcurrentMap и NavigableMap.

Классы:

AbstractMap частично реализует Map и содержит AbstractMap.SimpleEntry и AbstractMap.SimpleImmutableEntry – изменяемую и неизменяемую пары ключ-значение. Классы пар не связаны через наследование из-за небольшого размера и наличия различных операций, но оба реализуют Map.Entry.

TreeMap implements NavigableMap – карта, реализованная с помощью красно-чёрного дерева.

HashMap – карта, реализуемая с помощью хэш-таблицы.

LinkedHashMap extends HashMap – хранит последовательность добавления-удаления значений. Если значение не добавлено, а изменено, порядок не изменяется.

WeakHashMap – карта, позволяющая Garbage Collector’у удалять пары ключ-значение (хранит только слабые ссылки).

IdentityHashMap -

EnumMap – карта, ключами которой является множество enum’ов. Хранит последовательность битов, что занимает мало памяти и быстро работает.

ConcurrentHashMap – карта, предоставляющая доступ нескольким потокам. Не блокируется при чтении.

Hashtable – старая реализация HashMap или даже ConcurrentHashMap. Синхронизирована.

  1. Стандартные алгоритмы обработки коллекций.

Алгоритмы для обработки коллекций содержаться в java.util.Collections в віде набора его статических методов.

sort(List) выполняет устойчивую сортировку списка слиянием (Merge Sort). Сортировка позволяет сортировать двусвязные списки, так как изначально копирует всё содержимое коллекции в массив, сортирует массив и записывает элементы в список. Метод требует чтобы элементы реализовывали Comparable или требует Comparator.

binarySearch(List) выполняет бинарный поиск в списке, при условии, что он отсортирован. Возвращает его позицию или -1, если элемент не найден.

reverse(List) – разворачивает список.

shuffle(List) – перемешивает список. Метод может принимать Random.

fill(List, Object) – заполняет коллекцию переданным элементом.

copy(List, List) – копирует всё из второго списка в первый.

min(Collection) – ищет минимум, может принимать компаратор.

max(Collection) – ищет максимум, может принимать компаратор.

rotate(List, int) – “прокручивает” список на заданное число, которое, вообще говоря, может быть отрицательным.

replaceAll(List, Object, Object) – заменяет все встретившиеся первые объекты на вторые, используя equals для сравнения.