- •Первая часть
- •Интерфейсы и классы коллекций.
- •Интерфейсы:
- •Классы:
- •Итераторы:
- •Компараторы:
- •Интерфейсы и классы карт.
- •Интерфейсы:
- •Классы:
- •IndexOfSubList/lastIndexOfSubList – производит поиск “подсписка”.
- •Вторая часть
- •Сериализация объектов.
- •Байтовые потоки.
- •Символьные потоки.
- •Объектные потоки.
- •Третья часть
Компараторы:
Некоторые коллекции и алгоритмы требуют, чтобы на множестве элементов, из которых состоит коллекция или карта было задано отношение порядка. Есть два способа его задать:
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 для самого компаратора. В том случае, если легко проверить, задает ли точно такое же отношение порядка, переданный компаратор или все компараторы класса задают одно и то же отношение порядка, это может увеличить быстродействие.
-
Интерфейсы и классы карт.
Интерфейсы:
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. Синхронизирована.
-
Стандартные алгоритмы обработки коллекций.
Алгоритмы для обработки коллекций содержаться в 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 для сравнения.