Update jcf.md
This commit is contained in:
parent
92ac2cc588
commit
cec5fd8ee2
22
jcf.md
22
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<E> {
|
|||
|
||||
## Сравните интерфейсы `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<E> {
|
|||
[к оглавлению](#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)
|
||||
|
||||
|
|
Loading…
Reference in New Issue