diff --git a/jcf.md b/jcf.md index 583bc0e..8a6ed74 100644 --- a/jcf.md +++ b/jcf.md @@ -8,7 +8,7 @@ + [В чем разница между классами `java.util.Collection` и `java.util.Collections`?](#В-чем-разница-между-классами-javautilcollection-и-javautilcollections) + [Что такое «fail-fast поведение»?](#Что-такое-fail-fast-поведение) + [Какая разница между fail-fast и fail-safe?](#Какая-разница-между-fail-fast-и-fail-safe) -+ [Приведите примеры итераторов реализующих поведение fail-safe](#Приведите-примеры-итераторов-реализующих-поведение-fail-safe) ++ [Приведите примеры итераторов, реализующих поведение fail-safe](#Приведите-примеры-итераторов-реализующих-поведение-fail-safe) + [Чем различаются `Enumeration` и `Iterator`.](#Чем-различаются-enumeration-и-iterator) + [Как между собой связаны `Iterable` и `Iterator`?](#Как-между-собой-связаны-iterable-и-iterator) + [Как между собой связаны `Iterable`, `Iterator` и «for-each»?](#Как-между-собой-связаны-iterable-iterator-и-for-each) @@ -117,7 +117,7 @@ _«Коллекция»_ - это структура данных, набор к + `Hashtable` — хэш-таблица, методы которой синхронизированы. Не позволяет использовать `null` в качестве значения или ключа и не является упорядоченной. + `HashMap` — хэш-таблица. Позволяет использовать `null` в качестве значения или ключа и не является упорядоченной. + `LinkedHashMap` — упорядоченная реализация хэш-таблицы. -+ `TreeMap` — реализация основанная на красно-чёрных деревьях. Является упорядоченной и предоставляет возможность управлять порядком элементов в коллекции при помощи объекта `Comparator`, либо сохраняет элементы с использованием «natural ordering». ++ `TreeMap` — реализация, основанная на красно-чёрных деревьях. Является упорядоченной и предоставляет возможность управлять порядком элементов в коллекции при помощи объекта `Comparator`, либо сохраняет элементы с использованием «natural ordering». + `WeakHashMap` — реализация хэш-таблицы, которая организована с использованием _weak references_ для ключей (сборщик мусора автоматически удалит элемент из коллекции при следующей сборке мусора, если на ключ этого элемента нет жёстких ссылок). [к оглавлению](#java-collections-framework) @@ -166,7 +166,7 @@ __fail-fast поведение__ означает, что при возникн [к оглавлению](#java-collections-framework) -## Приведите примеры итераторов реализующих поведение fail-safe +## Приведите примеры итераторов, реализующих поведение fail-safe Итератор коллекции `CopyOnWriteArrayList` и итератор представления `keySet` коллекции `ConcurrentHashMap` являются примерами итераторов fail-safe. [к оглавлению](#java-collections-framework) @@ -256,8 +256,8 @@ FILO, First-In-Last-Out («первым пришел, последним уше + доступ к произвольному элементу по индексу за _константное_ время _O(1)_; + доступ к элементам по значению за _линейное_ время _O(N)_; + вставка в конец в среднем производится за _константное_ время _O(1)_; -+ удаление произвольного элемента из списка занимает значительное время т.к. при этом все элементы находящиеся «правее» смещаются на одну ячейку влево (реальный размер массива (capacity) не изменяется); -+ вставка элемента в произвольное место списка занимает значительное время т.к. при этом все элементы находящиеся «правее» смещаются на одну ячейку вправо; ++ удаление произвольного элемента из списка занимает значительное время т.к. при этом все элементы, находящиеся «правее» смещаются на одну ячейку влево (реальный размер массива (capacity) не изменяется); ++ вставка элемента в произвольное место списка занимает значительное время т.к. при этом все элементы, находящиеся «правее» смещаются на одну ячейку вправо; + минимум накладных расходов при хранении. `LinkedList`: @@ -267,7 +267,7 @@ FILO, First-In-Last-Out («первым пришел, последним уше + вставка или удаление в/из произвольного место _константное_ _O(1)_; + требует больше памяти для хранения такого же количества элементов, потому что кроме самого элемента хранятся еще указатели на следующий и предыдущий элементы списка. -В целом, `LinkedList` в абсолютных величинах проигрывает `ArrayList` и по потребляемой памяти и по скорости выполнения операций. `LinkedList` предпочтительно применять, когда нужны частые операции вставки/удаления или в случаях, когда необходимо гарантированное время добавления элемента в список. +В целом, `LinkedList` в абсолютных величинах проигрывает `ArrayList` и по потребляемой памяти, и по скорости выполнения операций. `LinkedList` предпочтительно применять, когда нужны частые операции вставки/удаления или в случаях, когда необходимо гарантированное время добавления элемента в список. [к оглавлению](#java-collections-framework) @@ -279,7 +279,7 @@ FILO, First-In-Last-Out («первым пришел, последним уше [к оглавлению](#java-collections-framework) ## Какое худшее время работы метода `contains()` для элемента, который есть в `LinkedList`? -_O(N)_. Время поиска элемента линейно пропорционально количеству элементов с списке. +_O(N)_. Время поиска элемента линейно пропорционально количеству элементов в списке. [к оглавлению](#java-collections-framework) @@ -307,7 +307,7 @@ _O(N)_. Вставка элемента в конец списка осущес ## Как происходит удаление элементов из `ArrayList`? Как меняется в этом случае размер `ArrayList`? -При удалении произвольного элемента из списка, все элементы находящиеся «правее» смещаются на одну ячейку влево и реальный размер массива (его емкость, capacity) не изменяется никак. Механизм автоматического «расширения» массива существует, а вот автоматического «сжатия» нет, можно только явно выполнить «сжатие» командой `trimToSize()`. +При удалении произвольного элемента из списка, все элементы, находящиеся «правее» смещаются на одну ячейку влево и реальный размер массива (его емкость, capacity) не изменяется никак. Механизм автоматического «расширения» массива существует, а вот автоматического «сжатия» нет, можно только явно выполнить «сжатие» командой `trimToSize()`. [к оглавлению](#java-collections-framework) @@ -481,9 +481,9 @@ private static class Node { ## Сравните интерфейсы `Queue` и `Deque`. ## Кто кого расширяет: `Queue` расширяет `Deque`, или `Deque` расширяет `Queue`? -`Queue` - это очередь, которая обычно (но необязательно) строится по принципу FIFO (First-In-First-Out) - соответственно извлечение элемента осуществляется с начала очереди, вставка элемента - в конец очереди. Хотя этот принцип нарушает, к примеру `PriorityQueue`, использующая «natural ordering» или переданный `Comparator` при вставке нового элемента. +`Queue` - это очередь, которая обычно (но необязательно) строится по принципу FIFO (First-In-First-Out) - соответственно извлечение элемента осуществляется с начала очереди, вставка элемента - в конец очереди. Хотя этот принцип нарушает, к примеру, `PriorityQueue`, использующая «natural ordering» или переданный `Comparator` при вставке нового элемента. -`Deque` (Double Ended Queue) расширяет `Queue` и согласно документации это линейная коллекция, поддерживающая вставку/извлечение элементов с обоих концов. Помимо этого реализации интерфейса `Deque` могут строится по принципу FIFO, либо LIFO. +`Deque` (Double Ended Queue) расширяет `Queue` и согласно документации, это линейная коллекция, поддерживающая вставку/извлечение элементов с обоих концов. Помимо этого, реализации интерфейса `Deque` могут строится по принципу FIFO, либо LIFO. Реализации и `Deque`, и `Queue` обычно не переопределяют методы `equals()` и `hashCode()`, вместо этого используются унаследованные методы класса Object, основанные на сравнении ссылок. @@ -512,7 +512,7 @@ private static class Node { [к оглавлению](#java-collections-framework) ## `Stack` считается «устаревшим». Чем его рекомендуют заменять? Почему? -`Stack` был добавлен в Java 1.0 как реализация стека LIFO (last-in-first-out) и является расширением коллекции `Vector`, хотя это несколько нарушает понятие стека (например, класс `Vector` предоставляет возможность обращаться к любому элементу по индексу). Является частично синхронизированной коллекцией (кроме метода добавления `push()`) с вытекающими отсюда последствиями в виде негативного воздействия на производительность. После добавления в Java 1.6 интерфейса `Deque`, рекомендуется использовать реализации именно этого интерфейса, например `ArrayDeque`. +`Stack` был добавлен в Java 1.0 как реализация стека LIFO (last-in-first-out) и является расширением коллекции `Vector`, хотя это несколько нарушает понятие стека (например, класс `Vector` предоставляет возможность обращаться к любому элементу по индексу). Является частично синхронизированной коллекцией (кроме метода добавления `push()`) с вытекающими отсюда последствиями в виде негативного воздействия на производительность. После добавления в Java 1.6 интерфейса `Deque`, рекомендуется использовать реализации именно этого интерфейса, например, `ArrayDeque`. [к оглавлению](#java-collections-framework)