JAVA COLLECTIONS FRAMEWORK » История » Версия 2
Александр Александров, 20.04.2019 22:46
1 | 1 | Александр Александров | h1. JAVA COLLECTIONS FRAMEWORK |
---|---|---|---|
2 | |||
3 | h2. Вопросы |
||
4 | |||
5 | # Что такое Коллекция? |
||
6 | # Назовите основные интерфейсы коллекций и их имплементации. |
||
7 | # Чем отличается ArrayList от LinkedList? В каких случаях лучше использовать первый, а в каких второй? |
||
8 | # Чем отличается HashMap от Hashtable? |
||
9 | # Чем отличается ArrayList от Vector? |
||
10 | # Как сравниваются елементы коллекций? |
||
11 | # Расположите в виде иерархии следующие интерфейсы: List, Set, Map, SortedSet, SortedMap, Collection,Iterable, Iterator, NavigableSet, NavigableMap. |
||
12 | # Почему Map - это не Collection, в то время как List и Set являются Collection? |
||
13 | # Дайте определение понятию "iterator". |
||
14 | # Что вы знаете об интерфейсе Iterable? |
||
15 | # Как одной строчкой преобразовать HashSet в ArrayList? |
||
16 | # Как одной строчкой преобразовать ArrayList в HashSet? |
||
17 | # Как перебрать все ключи Map учитывая, что Map - это не Iterable? |
||
18 | # Как перебрать все значения Map учитывая, что Map - это не Iterable? |
||
19 | # Как перебрать все пары ключ-значение в Map учитывая, что Map - это не Iterable? |
||
20 | # В чем проявляется "сортированность" SortedMap, кроме того, что toString() выводит все по порядку? |
||
21 | # Как одним вызовом копировать элементы из любой Collection в массив? |
||
22 | # Реализуйте симметрическую разность двух коллекций используя методы Collection(addAll(), removeAll(), retainAll()). |
||
23 | # Сравните Enumeration и Iterator. |
||
24 | # Как между собой связаны Iterable и Iterator? |
||
25 | # Как между собой связаны Iterable, Iterator и "for-each " введенный в Java 5? |
||
26 | # Сравните Iterator и ListIterator. |
||
27 | # Что произойдет, если я вызову Iterator.next() не "спросив" Iterator.hasNext()? |
||
28 | # Что произойдет, если я вызову Iterator.next() перед этим 10 раз вызвав Iterator.hasNext()? Я пропущу 9 элементов? |
||
29 | # Если у меня есть коллекция и порожденный итератор, изменится ли коллекция, если я вызову iterator.remove()? |
||
30 | # Если у меня есть коллекция и порожденный итератор, изменится ли итератор, если я вызову collection.remove(..)? |
||
31 | # Зачем добавили ArrayList, если уже был Vector? |
||
32 | # В реализации класса ArrayList есть следующие поля: Object[] elementData, int size. |
||
33 | # Объясните, зачем хранить отдельно size, если всегда можно взять elementData.length? |
||
34 | # LinkedList - это односвязный, двусвязный или четырехсвязный список? |
||
35 | # Какое худшее время работы метода contain() для элемента, который есть в LinkedList (O(1), O(log(N)), O(N), O(N*log(N)), O(N*N))? |
||
36 | # Какое худшее время работы метода contain() для элемента, который есть в ArrayList (O(1), O(log(N)), O(N), O(N*log(N)), O(N*N))? |
||
37 | # Какое худшее время работы метода add() для LinkedList (O(1), O(log(N)), O(N), O(N*log(N)), O(N*N))? |
||
38 | # Какое худшее время работы метода add() для ArrayList (O(1), O(log(N)), O(N), O(N*log(N)), O(N*N))? |
||
39 | # Сколько выделяется элементов в памяти при вызове ArrayList.add()? |
||
40 | # Сколько выделяется элементов в памяти при вызове LinkedList.add()? |
||
41 | # Оцените количество памяти на хранение одного примитива типа byte в LinkedList? |
||
42 | # Оцените количество памяти на хранение одного примитива типа byte в ArrayList? |
||
43 | # Я добавляю элемент в середину List-а: list.add(list.size()/2, newElem). Для кого эта операция медленнее - для ArrayList или для LinkedList? |
||
44 | # Как перебрать элементы LinkedList в обратном порядке, не используя медленный get(index)? |
||
45 | # Как одним вызовом из List получить List со всеми элементами, кроме первых и последних 3-х? |
||
46 | # Могут ли у разных объектов в памяти (ref0 != ref1) быть ref0.hashCode() == ref1.hashCode()? |
||
47 | # Могут ли у разных объектов в памяти (ref0 != ref1) быть ref0.equals(ref1) == true? |
||
48 | # Могут ли у разных ссылок на один объект в памяти (ref0 == ref1) быть ref0.equals(ref1) == false? |
||
49 | # Есть класс Point{int x, y;}. Почему хэш-код в виде 31 * x + y предпочтительнее чем x + y? |
||
50 | # Если у класса Point{int x, y;} "правильно " реализовать метод equals (return ref0.x == ref1.x && ref0.y == ref1.y), но сделать хэш-код в виде int hashCode() {return x;}, то будут ли корректно такие точки помещаться и извлекаться из HashSet? |
||
51 | # equals() порождает отношение эквивалентности. Какими из свойств обладает такое отношение: коммутативность, симметричность, рефлексивность, дистрибутивность, ассоциативность, транзитивность? |
||
52 | # Можно ли так реализовать equals(Object that) {return this.hashCode() == that.hashCode()}? |
||
53 | # В equals требуется проверять, что аргумент (equals(Object that)) такого же типа как и сам объект. В чем разница между this.getClass() == that.getClass() и that instanceof MyClass? |
||
54 | # Можно ли реализовать метод equals класса MyClass вот так: class MyClass {public boolean equals(MyClass that) {return this == that;}}? |
||
55 | # Будет ли работать HashMap, если все ключи будут возвращать int hashCode() {return 42;}? |
||
56 | # Зачем добавили HashMap, если уже был Hashtable? |
||
57 | # Согласно Кнуту и Кормену существует две основных реализации хэш-таблицы: на основе открытой адресацией и на основе метода цепочек. Как реализована HashMap? Почему так сделали (по вашему мнению)? В чем минусы и плюсы каждого подхода? |
||
58 | # Сколько переходов по ссылкам происходит, когда вы делаете HashMap.get(key) по ключу, который есть в таблице? |
||
59 | # Сколько создается новых объектов, когда вы добавляете новый элемент в HashMap? |
||
60 | # Как работает HashMap при попытке сохранить в нее два элемента по ключам с |
||
61 | # одинаковым hashCode, но для которых equals == false? |
||
62 | # HashMap может выродиться в список даже для ключей с разным hashCode. Как это возможно? |
||
63 | # Какое худшее время работы метода get(key) для ключа, которого нет в таблице (O(1), O(log(N)), O(N), O(N*log(N)), O(N*N))? |
||
64 | # Какое худшее время работы метода get(key) для ключа, который есть в таблице (O(1), O(log(N)), O(N), O(N*log(N)), O(N*N))? |
||
65 | # Объясните смысл параметров в конструкторе HashMap(int initialCapacity, float loadFactor). |
||
66 | # В чем разница между HashMap и IdentityHashMap? Для чего нужна IdentityHashMap? Как может быть полезна для реализации сериализации или клонирования? |
||
67 | # В чем разница между HashMap и WeakHashMap? Для чего нужна WeakHashMap? |
||
68 | # В WeakHashMap используются WeakReferences. А почему бы не создать SoftHashMap на SoftReferences? |
||
69 | # В WeakHashMap используются WeakReferences. А почему бы не создать PhantomHashMap на PhantomReferences? |
||
70 | # Сделайте HashSet из HashMap (используйте только множество ключей, но не множество значений). |
||
71 | # Сделайте HashMap из HashSet (HashSet<Map.Entry<K, V>>) |
||
72 | # Сравните интерфейсы java.util.Queue и java.util.Deque. |
||
73 | # Кто кого расширяет: Queue расширяет Deque, или Deque расширяет Queue? |
||
74 | # Почему LinkedList реализует и List, и Deque? |
||
75 | # В чем разница между классами java.util.Arrays и java.lang.reflect.Array? |
||
76 | # В чем разница между классами java.util.Collection и java.util.Collections? |
||
77 | # Напишите НЕмногопоточную программу, которая заставляет коллекцию выбросить ConcurrentModificationException. |
||
78 | # Что такое "fail-fast поведение"? |
||
79 | # Для множеств еnum-ов есть специальный класс java.util.EnumSet? Зачем? Чем авторов не устраивал HashSet или TreeSet? |
||
80 | # java.util.Stack - считается "устаревшим". Чем его рекомендуют заменять? Почему? |
||
81 | # Какая коллекция реализует дисциплину обслуживания FIFO? |
||
82 | # Какая коллекция реализует дисциплину обслуживания FILO? |
||
83 | # Приведите пример, когда какая-либо коллекция выбрасывает UnsupportedOperationException. |
||
84 | # Почему нельзя написать "ArrayList<List> numbers = new ArrayList<ArrayList>();" но можно "List<ArrayList> numbers = new ArrayList<ArrayList>();"? |
||
85 | # LinkedHashMap - что это еще за "зверь"? Что в нем от LinkedList, а что от HashMap? |
||
86 | # LinkedHashSet - что это еще за "зверь"? Что в нем от LinkedList, а что от HashSet? |
||
87 | # Говорят, на LinkedHashMap легко сделать простенький кэш c "invalidation policy", знаете как? |
||
88 | # Что позволяет сделать PriorityQueue? |
||
89 | # В чем заключаются отличия java.util.Comparator от java.lang.Comparable? |
||
90 | |||
91 | h2. Ответы |
||
92 | |||
93 | h3. Что такое Коллекция? |
||
94 | |||
95 | 2 | Александр Александров | Коллекции - это хранилища или контейнеры, поддерживающие различные способы накопления и упорядочения объектов с целью обеспечения возможностей эффективного доступа к ним. Они представляют собой реализацию абстрактных структур данных, поддерживающих три основные операции: |
96 | 1 | Александр Александров | |
97 | 2 | Александр Александров | * добавление нового элемента в коллекцию; |
98 | * удаление элемента из коллекции; |
||
99 | * изменение элемента в коллекции. |
||
100 | |||
101 | 1 | Александр Александров | h3. Назовите основные интерфейсы коллекций и их имплементации. |
102 | |||
103 | 2 | Александр Александров | {{dmsf_image(199)}} |
104 | 1 | Александр Александров | |
105 | 2 | Александр Александров | Сollection расширяет три интерфейса: *List* , *Set* , *Queue* . |
106 | |||
107 | *List* - хранит упорядоченные елементы(могут быть одинаковые); Имеет такие реализации как _LinkedList_, _ArrayList_ и _Vector_. |
||
108 | |||
109 | * Vector синхронизирован, и по этому в одном потоке, он работает медленней остальных реализаций. |
||
110 | * ArrayList - его преимущество в навигации по коллекции. |
||
111 | * LinkedList - его преимущество в во вставке и удалении элементов в коллекции. |
||
112 | |||
113 | *Set* - коллекции, которые не содержат повторяющихся элементов. Основные реализации: _HashSet_, _TreeSet_, _LinkedHashSet_ |
||
114 | |||
115 | * TreeSet - упорядочивает элементы по их значениям; |
||
116 | * HashSet - упорядочивает элементы по их хэш ключах, хотя на первый взляд может показаться что элементы хранятся в случайном порядке. |
||
117 | * LinkedHashSet - хранит элементы в порядке их добавления. |
||
118 | |||
119 | *Queue* - интерфейс для реализации очереди в java. Основные реализации: _LinkedList_, _PriorityQueue_. Очереди работают по принципу FIFO – First in First out. |
||
120 | |||
121 | *Map* - интерфейс для реализации так называемой карты, где элементы хранятся с их ключами. Основные реализации: _HashTable_, _HashMap_, _TreeMap_, _LinkedHashMap_ |
||
122 | |||
123 | * HashTable - синхронизированна, объявлена уставревшей. |
||
124 | * HashMap - порядок елементов рассчитывается по хэш ключу; |
||
125 | * TreeMap - элементы хранятся в отсортированном порядке |
||
126 | * LinkedHashMap - элементы хранятся в порядке вставки |
||
127 | |||
128 | *%{color: red}Ключи в Мар не могут быть одинаковыми!%* |
||
129 | |||
130 | Синхронизировать не синхронизированные коллекции и карты можно посредством класса Collections.synchronizedMap(MyMap)\synchronizedList(MyList). |
||
131 | |||
132 | 1 | Александр Александров | h3. Чем отличается ArrayList от LinkedList? В каких случаях лучше использовать первый, а в каких второй? |
133 | |||
134 | 2 | Александр Александров | Отличие заключается в способе хранения данных. ArrayList хранит в виде массива, а LinkedList - в виде списка (двунаправленного). |
135 | В ArrayList быстрее происходит сортировка, т.к. для ее выполнения данные списка копируются в массив (а копировать из массива ArrayList в массив для сортировки быстрее). При большом числе операций добавления и удаления LinkedList должен быть более удачным выбором, т.к. при этих операциях не приходится перемещать части массива. |
||
136 | Если при добавлении в ArrayList превышается его объем, размер массива увеличивается, новая емкость рассчитывается по формуле (oldCapacity * 3) / 2 + 1, поэтому лучше указывать размер при создании или, если он не известен, использовать LinkedList (но это может быть существенно при слишком уж больших объемах данных). |
||
137 | 1 | Александр Александров | |
138 | h3. Чем отличается HashMap от Hashtable? |
||
139 | |||
140 | 2 | Александр Александров | Класс HashMap по функционалу очень похож на Hashtable. Главное отличие в том, что методы класса Hashtable синхронизированы, а HashMap - нет. Кроме этого класс HashMap в отличии от Hashtable разрешает использование null в качестве ключей и значений. |
141 | Наличие синхронизации в Hashtable уменьшает производительность кода, использующего данный класс. Поэтому классы JCF (Java Collections Framework, появившийся в Java 2), в том числе и HashMap, несинхронизированы. Если синхронизация все же нужна, можно использовать методы класса Collections: Collections.synchronizedMap(map), Collections.synchronizedList(list) или Collections.synchronizedSet(set). |
||
142 | Данные методы возвращают синхронизированный декоратор переданной коллекции. При этом все равно в случае итерирования по коллекции требуется ручная синхронизация. Начиная с Java 6 JCF был расширен специальными коллекциями, поддерживающими многопоточный доступ, такими как CopyOnWriteArrayList и ConcurrentHashMap. |
||
143 | 1 | Александр Александров | |
144 | h3. Чем отличается ArrayList от Vector? |
||
145 | |||
146 | 2 | Александр Александров | Методы класса Vector синхронизированы, в то время как ArrayList - нет. |
147 | 1 | Александр Александров | |
148 | 2 | Александр Александров | h3. Как сравниваются элементы коллекций? |
149 | 1 | Александр Александров | |
150 | 2 | Александр Александров | Для сравнения элементов коллекций используется метод equals() и hashcode();Эти методы унаследованы от класса Object. |
151 | 1 | Александр Александров | |
152 | 2 | Александр Александров | * Если наш пользовательский класс переопределяет equals(), то он должен и переопределить hashcode(). |
153 | * Если два объекта эквивалентны, то и хэш коды этих объектов тоже должны быть равны. |
||
154 | * Если поле не используется в equals(), то оно и не должно использоваться в hashcode(). |
||
155 | |||
156 | 1 | Александр Александров | h3. Расположите в виде иерархии следующие интерфейсы: List, Set, Map, SortedSet, SortedMap, Collection,Iterable, Iterator, NavigableSet, NavigableMap. |
157 | |||
158 | 2 | Александр Александров | {{dmsf_image(200)}} |
159 | 1 | Александр Александров | |
160 | h3. Почему Map - это не Collection, в то время как List и Set являются Collection? |
||
161 | |||
162 | 2 | Александр Александров | Коллекция (List и Set) представляет собой совокупность некоторых элементов (обычно экземпляров одного класса). Map -это совокупность пар "ключ"-"значение". |
163 | Соответственно некоторые методы интерфейса Collection нельзя использовать в Map. Например, метод remove(Object o) в интерфейсе Collection предназначен для удаления элемента, тогда как такой же метод remove(Object key) в интерфейсе Map - удаляет элемент по заданному ключу. |
||
164 | 1 | Александр Александров | |
165 | h3. Дайте определение понятию "iterator". |
||
166 | |||
167 | 2 | Александр Александров | Итератор - объект, позволяющий перебирать элементы коллекции. Например foreach реализован с использованием итератора. Одним из ключевых методов интерфейса Collection является метод Iterator<E> iterator(). Он возвращает итератор - то есть объект, реализующий интерфейс Iterator. Интерфейс Iterator имеет следующее определение: |
168 | 1 | Александр Александров | |
169 | 2 | Александр Александров | <pre><code class="java"> |
170 | public interface Iterator <E> { |
||
171 | E next; |
||
172 | boolean hasNext(); |
||
173 | void remove(); |
||
174 | } |
||
175 | </code></pre> |
||
176 | 1 | Александр Александров | |
177 | h3. Что вы знаете об интерфейсе Iterable? |
||
178 | |||
179 | 2 | Александр Александров | Все коллекции из java.util реализуют интерфейс Collection, который, в свою очередь, расширяет интерфейс Iterable. В интерфейсе Iterable описан только один метод: _Iterator iterator();_ |
180 | Он возвращает Iterator, т.е. объект, который поочерёдно возвращает все элементы коллекции. |
||
181 | 1 | Александр Александров | |
182 | h3. Как одной строчкой преобразовать HashSet в ArrayList? |
||
183 | |||
184 | 2 | Александр Александров | <pre><code class="java"> |
185 | public static void main(String[] args) { |
||
186 | Set<String> set = new HashSet<>(); |
||
187 | set.add("A"); |
||
188 | set.add("B"); |
||
189 | List<String> list = new ArrayList<>(set); |
||
190 | } |
||
191 | </code></pre> |
||
192 | 1 | Александр Александров | |
193 | h3. Как одной строчкой преобразовать ArrayList в HashSet? |
||
194 | |||
195 | 2 | Александр Александров | <pre><code class="java"> |
196 | public static void main(String[] args) { |
||
197 | List<String> list = new ArrayList<>(); |
||
198 | list.add("A"); |
||
199 | list.add("B"); |
||
200 | Set<String> set = new HashSet<>(list); |
||
201 | } |
||
202 | </code></pre> |
||
203 | 1 | Александр Александров | |
204 | h3. Как перебрать все ключи Map учитывая, что Map - это не Iterable? |
||
205 | |||
206 | 2 | Александр Александров | Использовать метод keySet(), который возвращает множество (Set<K>) ключей. |
207 | 1 | Александр Александров | |
208 | h3. Как перебрать все значения Map учитывая, что Map - это не Iterable? |
||
209 | |||
210 | 2 | Александр Александров | Использовать метод values(), который возвращает коллекцию (Collection<V>) значений. |
211 | 1 | Александр Александров | |
212 | h3. Как перебрать все пары ключ-значение в Map учитывая, что Map - это не Iterable? |
||
213 | |||
214 | 2 | Александр Александров | Использовать метод entrySet(), который возвращает множество (Set<Map.Entry<K, V>) пар "ключ"-"значение". |
215 | 1 | Александр Александров | |
216 | h3. В чем проявляется "сортированность" SortedMap, кроме того, что toString() выводит все по порядку? |
||
217 | |||
218 | 2 | Александр Александров | Естественное упорядочивание (natural ordering) отражается при итерации по коллекции ключей или значений хэш-таблицы (возвращаемых методами keySet(), values() и entrySet()). |
219 | 1 | Александр Александров | |
220 | h3. Как одним вызовом копировать элементы из любой Collection в массив? |
||
221 | |||
222 | 2 | Александр Александров | <pre><code class="java"> |
223 | public static void main(String[] args) { |
||
224 | List<String> list = new ArrayList<>(); |
||
225 | list.add("A"); |
||
226 | list.add("B"); |
||
227 | String[] strArray = list.toArray(new String[list.size()]); |
||
228 | // или |
||
229 | Object[] objArray = list.toArray(); |
||
230 | } |
||
231 | </code></pre> |
||
232 | 1 | Александр Александров | |
233 | h3. Реализуйте симметрическую разность двух коллекций используя методы Collection(addAll(), removeAll(), retainAll()). |
||
234 | |||
235 | 2 | Александр Александров | Симметрическая разность двух коллекций - это множество элементов, одновременно не принадлежащих обоим исходным коллекциям. |
236 | 1 | Александр Александров | |
237 | 2 | Александр Александров | {{dmsf_image(201)}} |
238 | 1 | Александр Александров | |
239 | h3. Сравните Enumeration и Iterator. |
||
240 | |||
241 | 2 | Александр Александров | Оба интерфейса предназначены для обхода коллекций. Интерфейс Iterator был введен несколько позднее в Java Collections Framework и его использование предпочтительнее. Основные различия Iterator по сравнению с Enumeration: |
242 | 1 | Александр Александров | |
243 | 2 | Александр Александров | * наличие метода remove() для удаления элемента из коллекции при обходе; |
244 | * исправлены имена методов для повышения читаемости кода. |
||
245 | 1 | Александр Александров | |
246 | h3. Как между собой связаны Iterable и Iterator? |
||
247 | |||
248 | 2 | Александр Александров | Интерфейс Iterable имеет только один метод - iterator(), который возвращает итератор коллекции для её обхода. |
249 | 1 | Александр Александров | |
250 | h3. Как между собой связаны Iterable, Iterator и "for-each " введенный в Java 5? |
||
251 | |||
252 | 2 | Александр Александров | Экземпляры классов, реализующих интерфейс Iterable, могут использоваться в конструкции foreach |
253 | 1 | Александр Александров | |
254 | h3. Сравните Iterator и ListIterator. |
||
255 | |||
256 | 2 | Александр Александров | ListIterator расширяет интерфейс Iterator, позволяя клиенту осуществлять обход коллекции в обоих направлениях, изменять коллекцию и получать текущую позицию итератора. При этом важно помнить, что ListIterator не указывает на конкретный элемент, а его текущая позиция располагается между элементами, которые возвращают методы previous() и next(). Таким образом, модификация коллекции осуществляется для последнего элемента, который был возвращен методами previous() и next(). |
257 | 1 | Александр Александров | |
258 | h3. Что произойдет, если я вызову Iterator.next() не "спросив" Iterator.hasNext()? |
||
259 | |||
260 | 2 | Александр Александров | Если итератор указывает на последний элемент коллекции, то возникнет исключение NoSuchElementException, иначе будет возвращен следующий элемент. |
261 | 1 | Александр Александров | |
262 | h3. Что произойдет, если я вызову Iterator.next() перед этим 10 раз вызвав Iterator.hasNext()? Я пропущу 9 элементов? |
||
263 | |||
264 | 2 | Александр Александров | Нет, hasNext() осуществляет только проверку наличия следующего элемента. |
265 | 1 | Александр Александров | |
266 | h3. Если у меня есть коллекция и порожденный итератор, изменится ли коллекция, если я вызову iterator.remove()? |
||
267 | |||
268 | 2 | Александр Александров | Вызов метода iterator.remove() возможен только после вызова метода iterator.next() хотя бы раз, иначе появится исключение IllegalStateException(). Если iterator.next() был вызван прежде, то iterator.remove() удалит элемент, на который указывает итератор. |
269 | 1 | Александр Александров | |
270 | h3. Если у меня есть коллекция и порожденный итератор, изменится ли итератор, если я вызову collection.remove(..)? |
||
271 | |||
272 | 2 | Александр Александров | Итератор не изменится, но при следующем вызове его методов возникнет исключение ConcurrentModiÙcationException. |
273 | 1 | Александр Александров | |
274 | h3. Зачем добавили ArrayList, если уже был Vector? |
||
275 | |||
276 | 2 | Александр Александров | Обе структуры данных предназначены для хранения коллекции элементов, в том числе дубликатов и null. Они основаны на использовании массивов, динамически расширяющихся при необходимости. Класс Vector был введен в JDK 1.0 и не является частью Java Collection Framework. Методы класса Vector синхронизированы, что обеспечивает потокобезопасность, но это приводит к снижению производительности, поэтому и был введен класс ArrayList, методы которого не синхронизированы. |
277 | 1 | Александр Александров | |
278 | h3. В реализации класса ArrayList есть следующие поля: Object[] elementData, int size. |
||
279 | |||
280 | 2 | Александр Александров | Размер массива elementData представляет собой вместимость (capacity) ArrayList, которая всегда больше переменной size - реального количества хранимых элементов. С добавлением новых элементов вместимость автоматически возрастает при необходимости. |
281 | 1 | Александр Александров | |
282 | h3. Объясните, зачем хранить отдельно size, если всегда можно взять elementData.length? |
||
283 | |||
284 | 2 | Александр Александров | Двухсвязный список: каждый элемент LinkedList хранит ссылку на предыдущий и следующий элементы. |
285 | 1 | Александр Александров | |
286 | h3. LinkedList - это односвязный, двусвязный или четырехсвязный список? |
||
287 | |||
288 | |||
289 | |||
290 | h3. Какое худшее время работы метода contain() для элемента, который есть в LinkedList (O(1), O(log(N)), O(N), O(N*log(N)), O(N*N))? |
||
291 | |||
292 | |||
293 | |||
294 | h3. Какое худшее время работы метода contain() для элемента, который есть в ArrayList (O(1), O(log(N)), O(N), O(N*log(N)), O(N*N))? |
||
295 | |||
296 | |||
297 | |||
298 | h3. Какое худшее время работы метода add() для LinkedList (O(1), O(log(N)), O(N), O(N*log(N)), O(N*N))? |
||
299 | |||
300 | |||
301 | |||
302 | h3. Какое худшее время работы метода add() для ArrayList (O(1), O(log(N)), O(N), O(N*log(N)), O(N*N))? |
||
303 | |||
304 | |||
305 | |||
306 | h3. Сколько выделяется элементов в памяти при вызове ArrayList.add()? |
||
307 | |||
308 | |||
309 | |||
310 | h3. Сколько выделяется элементов в памяти при вызове LinkedList.add()? |
||
311 | |||
312 | |||
313 | |||
314 | h3. Оцените количество памяти на хранение одного примитива типа byte в LinkedList? |
||
315 | |||
316 | |||
317 | |||
318 | h3. Оцените количество памяти на хранение одного примитива типа byte в ArrayList? |
||
319 | |||
320 | |||
321 | |||
322 | h3. Я добавляю элемент в середину List-а: list.add(list.size()/2, newElem). Для кого эта операция медленнее - для ArrayList или для LinkedList? |
||
323 | |||
324 | |||
325 | |||
326 | h3. Как перебрать элементы LinkedList в обратном порядке, не используя медленный get(index)? |
||
327 | |||
328 | |||
329 | |||
330 | h3. Как одним вызовом из List получить List со всеми элементами, кроме первых и последних 3-х? |
||
331 | |||
332 | |||
333 | |||
334 | h3. Могут ли у разных объектов в памяти (ref0 != ref1) быть ref0.hashCode() == ref1.hashCode()? |
||
335 | |||
336 | |||
337 | |||
338 | h3. Могут ли у разных объектов в памяти (ref0 != ref1) быть ref0.equals(ref1) == true? |
||
339 | |||
340 | |||
341 | |||
342 | h3. Могут ли у разных ссылок на один объект в памяти (ref0 == ref1) быть ref0.equals(ref1) == false? |
||
343 | |||
344 | |||
345 | |||
346 | h3. Есть класс Point{int x, y;}. Почему хэш-код в виде 31 * x + y предпочтительнее чем x + y? |
||
347 | |||
348 | |||
349 | |||
350 | h3. Если у класса Point{int x, y;} "правильно " реализовать метод equals (return ref0.x == ref1.x && ref0.y == ref1.y), но сделать хэш-код в виде int hashCode() {return x;}, то будут ли корректно такие точки помещаться и извлекаться из HashSet? |
||
351 | |||
352 | |||
353 | |||
354 | h3. equals() порождает отношение эквивалентности. Какими из свойств обладает такое отношение: коммутативность, симметричность, рефлексивность, дистрибутивность, ассоциативность, транзитивность? |
||
355 | |||
356 | |||
357 | |||
358 | h3. Можно ли так реализовать equals(Object that) {return this.hashCode() == that.hashCode()}? |
||
359 | |||
360 | |||
361 | |||
362 | h3. В equals требуется проверять, что аргумент (equals(Object that)) такого же типа как и сам объект. В чем разница между this.getClass() == that.getClass() и that instanceof MyClass? |
||
363 | |||
364 | |||
365 | h3. Можно ли реализовать метод equals класса MyClass вот так: class MyClass {public boolean equals(MyClass that) {return this == that;}}? |
||
366 | |||
367 | |||
368 | h3. Будет ли работать HashMap, если все ключи будут возвращать int hashCode() {return 42;}? |
||
369 | |||
370 | |||
371 | h3. Зачем добавили HashMap, если уже был Hashtable? |
||
372 | |||
373 | |||
374 | h3. Согласно Кнуту и Кормену существует две основных реализации хэш-таблицы: на основе открытой адресацией и на основе метода цепочек. Как реализована HashMap? Почему так сделали (по вашему мнению)? В чем минусы и плюсы каждого подхода? |
||
375 | |||
376 | |||
377 | h3. Сколько переходов по ссылкам происходит, когда вы делаете HashMap.get(key) по ключу, который есть в таблице? |
||
378 | |||
379 | |||
380 | h3. Сколько создается новых объектов, когда вы добавляете новый элемент в HashMap? |
||
381 | |||
382 | |||
383 | h3. Как работает HashMap при попытке сохранить в нее два элемента по ключам с одинаковым hashCode, но для которых equals == false? |
||
384 | |||
385 | |||
386 | h3. HashMap может выродиться в список даже для ключей с разным hashCode. Как это возможно? |
||
387 | |||
388 | |||
389 | h3. Какое худшее время работы метода get(key) для ключа, которого нет в таблице (O(1), O(log(N)), O(N), O(N*log(N)), O(N*N))? |
||
390 | |||
391 | |||
392 | h3. Какое худшее время работы метода get(key) для ключа, который есть в таблице (O(1), O(log(N)), O(N), O(N*log(N)), O(N*N))? |
||
393 | |||
394 | |||
395 | h3. Объясните смысл параметров в конструкторе HashMap(int initialCapacity, float loadFactor). |
||
396 | |||
397 | |||
398 | h3. В чем разница между HashMap и IdentityHashMap? Для чего нужна IdentityHashMap? Как может быть полезна для реализации сериализации или клонирования? |
||
399 | |||
400 | |||
401 | h3. В чем разница между HashMap и WeakHashMap? Для чего нужна WeakHashMap? |
||
402 | |||
403 | |||
404 | h3. В WeakHashMap используются WeakReferences. А почему бы не создать SoftHashMap на SoftReferences? |
||
405 | |||
406 | |||
407 | h3. В WeakHashMap используются WeakReferences. А почему бы не создать PhantomHashMap на PhantomReferences? |
||
408 | |||
409 | |||
410 | h3. Сделайте HashSet из HashMap (используйте только множество ключей, но не множество значений). |
||
411 | |||
412 | |||
413 | h3. Сделайте HashMap из HashSet (HashSet<Map.Entry<K, V>>) |
||
414 | |||
415 | |||
416 | h3. Сравните интерфейсы java.util.Queue и java.util.Deque. |
||
417 | |||
418 | |||
419 | h3. Кто кого расширяет: Queue расширяет Deque, или Deque расширяет Queue? |
||
420 | |||
421 | |||
422 | h3. Почему LinkedList реализует и List, и Deque? |
||
423 | |||
424 | |||
425 | h3. В чем разница между классами java.util.Arrays и java.lang.reflect.Array? |
||
426 | |||
427 | |||
428 | h3. В чем разница между классами java.util.Collection и java.util.Collections? |
||
429 | |||
430 | |||
431 | h3. Напишите НЕмногопоточную программу, которая заставляет коллекцию выбросить ConcurrentModificationException. |
||
432 | |||
433 | |||
434 | h3. Что такое "fail-fast поведение"? |
||
435 | |||
436 | |||
437 | h3. Для множеств еnum-ов есть специальный класс java.util.EnumSet? Зачем? Чем авторов не устраивал HashSet или TreeSet? |
||
438 | |||
439 | |||
440 | h3. java.util.Stack - считается "устаревшим". Чем его рекомендуют заменять? Почему? |
||
441 | |||
442 | |||
443 | h3. Какая коллекция реализует дисциплину обслуживания FIFO? |
||
444 | |||
445 | |||
446 | h3. Какая коллекция реализует дисциплину обслуживания FILO? |
||
447 | |||
448 | |||
449 | h3. Приведите пример, когда какая-либо коллекция выбрасывает UnsupportedOperationException. |
||
450 | |||
451 | |||
452 | h3. Почему нельзя написать "ArrayList<List> numbers = new ArrayList<ArrayList>();" но можно "List<ArrayList> numbers = new ArrayList<ArrayList>();"? |
||
453 | |||
454 | |||
455 | h3. LinkedHashMap - что это еще за "зверь"? Что в нем от LinkedList, а что от HashMap? |
||
456 | |||
457 | |||
458 | h3. LinkedHashSet - что это еще за "зверь"? Что в нем от LinkedList, а что от HashSet? |
||
459 | |||
460 | |||
461 | h3. Говорят, на LinkedHashMap легко сделать простенький кэш c "invalidation policy", знаете как? |
||
462 | |||
463 | |||
464 | h3. Что позволяет сделать PriorityQueue? |
||
465 | |||
466 | |||
467 | h3. В чем заключаются отличия java.util.Comparator от java.lang.Comparable? |