Ответы на экзаменационные вопросы интернет-курсов ИНТУИТ
Ответы на экзаменационные вопросы интернет-курсов ИНТУИТ (INTUIT): 091. Введение в JavaScript
1. Автоматический сборщик мусора (garbage collector) в Java – это механизм, который:
2. Будет ли переменная sb после выполнения кода в строке 2 указывать на тот же самый объект?
3. В JDK 1.2 введены новые классы и интерфейсы, которые позволяют работать с наборами объектов. Отметьте те из них, которые являются интерфейсами.
4. В чем особенность класса-обертки для void?
5. В чем разница между классами List и Choice?
6. Выберите все правильные ответы.
7. Для каких значений числовой переменной x будет верно следующее выражение?
8. Для каких примитивных типов Java существуют классы-обертки?
9. Для каких элементов класса работает полиморфизм?
10. Для чего служит в Java класс Thread?
11. Если в классе заводится новый элемент и пока нет никаких факторов, позволяющих выбрать тот или иной модификатор доступа, какой модификатор следует использовать?
12. Если в классе переопределяется метод toString(), какой еще метод необходимо переопределить для корректного использования объектов этого класса в хэш-таблицах?
13. Если вызвать write(0x) у экземпляра OutputStream, то в каком порядке и какие байты будут записаны в выходной поток?
14. Если имеется переменная типа абстрактный класс, можно ли с ее помощью обращаться к абстрактным методам этого класса
15. Если метод использует переменную класса, должна ли она быть объявлена выше объявления метода?
16. Если один поток начал исполнение synchronized-блока, указав ссылку на некий объект, может ли другой поток обратиться к полю этого объекта? К методу?
17. Зачем нужен полиморфизм?
18. Значение какого типа будет хранить переменная после инициализации?
19. Инкапсуляция – это:
20. Как записать в Java-программе символ с кодом 546?
21. Как записывается заголовок метода main?
22. Как инициализировать массив, эквивалентный объявляемому ниже, но без заведения переменной?
23. Как определить, можно ли преобразовать один тип массива к другому?
24. Как получить объект класса Color из AWT, описывающий чистый синий цвет?
25. Какая из приведенных ниже UML-диаграмм является верной:
26. Какая кодировка используется классом OutputStreamWriter по умолчанию?
27. Какая строка будет выдана на консоль после выполнения фрагмента кода, приведенного ниже?
28. Какие версии Java называются Java 2?
29. Какие высказывания относительно java. util. Vector и java. util. Hashtable можно считать корректными?
30. Какие заголовки методов являются корректными с точки зрения компилятора?
31. Какие значения не могут участвовать в преобразовании к строке?
32. Какие из методов выбрасывают InterruptedException?
33. Какие из перечисленных идентификаторов являются корректными?
34. Какие из перечисленных ниже имен являются составными?
35. Какие из перечисленных ниже терминов относятся к подуровням второго уровня?
36. Какие из перечисленных ниже характеристик относятся к протоколу TCP?
37. Какие из перечисленных свойств являются общими для программ, написанных на C++ и Java?
38. Какие из следующих адресов относятся к подсети класса B?
39. Какие источники могут использоваться классами стандартных входных потоков java в качестве источника данных?
40. Какие классы и интерфейсы, необходимые для поддержки многопоточности, определены в пакете java. lang?
41. Какие классы предоставляют методы для записи в поток двоичного представления значений примитивных типов Java?
42. Какие методы объявлены в интерфейсе Serializable?
43. Какие модификаторы позволяют обращаться к элементу из классов того же пакета?
44. Какие модификаторы присутствуют в определении класса Math?
45. Какие преимущества дает многопоточная архитектура?
46. Какие утверждения верны?
47. Какие утверждения относительно использования метода newInstance() объектов типа Class для создания экземпляров соответствующего класса верны?
48. Какие утверждения относительно клонирования верны?
49. Какие формальные нарушения соглашений по именованию присутствуют в следующем примере:
50. Каким будет результат работы следующего кода?
51. Каким будет результат следующей строки (код символа восклицательного знака 33)?
52. Каким будет результат следующих действий?
53. Каким будет результат следующих действий?
54. Каким классом лучше воспользоваться для загрузки web-страницы с сервера?
55. Каким классом лучше воспользоваться для рассылки сигналов точного времени?
56. Каким образом на однопроцессорной машине исполняются многопоточные приложения?
57. Какими из перечисленных свойств обладает платформа Java?
58. Какими параметрами в Java характеризуется шрифт?
59. Каков будет результат выполнения программы:
60. Каков будет результат работы следующего кода:
61. Каков будет результат следующего примера?
62. Каков будет результат следующего примера?
63. Каков будет результат следующих действий?
64. Какое значение будет выведено на консоль в представленном фрагменте кода?
65. Какое значение появится на консоли после выполнения следующего кода?
66. Какое значение появится на консоли после выполнения следующей программы?
67. Какое из выражений относительно класса java. *****ntime является корректным?
68. Какое из перечисленных ниже имен является идентификатором?
69. Какое из перечисленных ниже имен является простым?
70. Какой из перечисленных ниже классов имеет наибольшее сходство с классом Vector?
71. Какой класс используется для представления модифицируемых строк?
72. Какой метод нужно вызвать, чтобы инициировать перерисовку компонента?
73. Какой метод нужно переопределить, чтобы реализовать отрисовку внешнего вида компонента?
74. Классы каких базовых исключений определены в пакете java. lang?
75. Корректен ли объявленный ниже класс? Если нет, то как его можно исправить?
76. Корректен ли следующий код?
77. Корректен ли следующий пример кода, и если да, то сколько преобразований будет произведено при его исполнении?
78. Корректен ли следующий пример? Если нет, то в каких строках какие ошибки будут сгенерированы?
79. Корректно ли следующее обращение к переменной x?
80. Корректны ли следующие преобразования?
82. Множественным наследованием называют:
83. Могут ли пакет и вложенные пакеты содержать одноименные классы?
84. Может ли быть дважды вызван метод init у апплета? Метод start?
85. Может ли возникнуть ошибка ArrayStoreException при работе следующих методов?
86. Может ли измениться содержимое переменной типа String, если передать ее в качестве аргумента при вызове метода?
87. Может ли массив основываться на абстрактных классах? Интерфейсах?
88. Можно ли клонировать объекты следующего класса?
89. Можно ли при наследовании не реализовывать абстрактный метод родительского класса?
90. Можно ли при переопределении некоторого абстрактного метода perform() использовать выражение super. perform()?
91. Можно ли с помощью класса URL пересылать данные на сервер?
92. Назовите сете-зависимые уровни модели OSI.
93. Назовите сете-независимые уровни модели OSI.
94. Необходимо написать метод, который возвращает случайное число в диапазоне от 0 до 100, кратное 5. Из перечисленных вариантов выберите правильный.
95. Необходимо написать метод, который получает в качестве параметра значение угла в градусах типа double и вычисляет его косинус. Какой из приведенных вариантов верен?
97. От какого класса наследуется класс Applet?
98. От какого класса наследуются InputStream и OutputStream?
99. От какого класса наследуются классы массивов?
100. Отметьте варианты ответа, в которых пары чисел равны друг-другу:
101. Отметьте ключевые слова языка Java:
102. Поскольку интерфейс Runnable представляет собой альтернативный способ программирования потоков исполнения, можно ли в такой программе обойтись без класса Thread?
103. Почему объектно-ориентированное программирование пришло на смену процедурному программированию?
104. Предположим, вы моделируете автомобиль, описывая его свойства в формате Java-класса. Какие из следующих полей нужно объявить динамическими?
105. Предположим, нам необходимо создать собственную иерархию исключений. Рассмотрим следующий пример.
106. Предположим, нам необходимо создать собственную иерархию исключений. Рассмотрим следующий пример.
107. Приведенная ниже программа должна вывести на консоль Hello World! Выберите строки, которые нужно модифицировать в вашей программе, чтобы получить правильный результат.
108. Программист располагает свою программу в каталоге c:\work. Программа состоит из одного класса demo. Start. Как следует расположить файл. class и как запускать виртуальную машину java?
109. Программист располагает свою программу в каталоге c:\work. Программа состоит из одного класса demo. Start. Как нужно расположить файл. java и как запускать компилятор javac?
110. Пусть класс User описывает пользователя системы. В качестве имени используется его e-mail адрес, который всем известен, а пароль, конечно, не должен быть доступен никому, кроме самого пользователя. Корректна ли следующая реализация?
111. Пусть классы Wolf и Rabbit являются наследниками класса Animal. Корректен ли следующий пример?
112. Рассмотрим пример. Эти исключения имеют следующую иерархию наследования:
113. Сколько вложенных компонентов может быть у контейнера ScrollPane?
114. Сколько комментариев в следующем примере кода:
115. Хотя примитивные массивы не могут участвовать в преобразованиях, однако массивы int[][] и byte[][] могут рассматриваться как одномерные объектные массивы, основанные на ссылочном типе «одномерный примитивный массив». Могут ли такие типы быть преобразованы из одного в другой?
116. Чему будет равно следующее выражение после вычислений?
117. Что будет выведено в результате выполнения следующего примера?
118. Что из перечисленного является в классе «Лифт» внешним интерфейсом:
119. Что из перечисленного является классами?
120. Что используется для описания поведения объекта?
121. Что означает выражение deprecated?
122. Что произойдет при попытке к одному объекту PipedWriter несколько раз присоединять объекты PipedReader?
123. Что произойдет, если, используя ObjectOutputStream, записать в файл значения типов long, int, byte именно в таком порядке, а считать в обратном, используя DataInputStream?
124. Что такое приоритет потока?
125. Эквивалентны ли две приведенные ниже операции над ссылочными переменными x1 и x2 (SomeClass2 – тип переменной x2)?
126. Является язык Java компилируемым или интерпретируемым?
Актуальная информация по учебным программам ИНТУИТ расположена по адресу: http://www. *****/.
(программ: 450)
(программ: 14)
Developer Project предлагает поддержку при сдаче экзаменов учебных курсов Интернет-университета информационных технологий INTUIT (ИНТУИТ). Мы ответили на экзаменационные вопросы 380 курсов INTUIT (ИНТУИТ), всего вопросов, ответов (некоторые вопросы курсов INTUIT имеют несколько правильных ответов). Текущий каталог ответов на экзаменационные вопросы курсов ИНТУИТ опубликован на сайте объединения Developer Project по адресу: http://www. dp5.su/
Подтверждения правильности ответов можно найти в разделе «ГАЛЕРЕЯ», верхнее меню, там опубликованы результаты сдачи экзаменов по 100 курсам (удостоверения, сертификаты и приложения с оценками).
Болеевопросов по 70 курсам и ответы на них, опубликованы на сайте http://www. dp5.su/, и доступны зарегистрированным пользователям. По остальным экзаменационным вопросам курсов ИНТУИТ мы оказываем платные услуги (см. вкладку верхнего меню «ЗАКАЗАТЬ УСЛУГУ». Условия поддержки и помощи при сдаче экзаменов по учебным программам ИНТУИТ опубликованы по адресу: http://www. dp5.su/
— часть вопросов могла не войти в настоящий перечень, т. к. они представлены в графической форме. В перечне возможны неточности формулировок вопросов, что связано с дефектами распознавания графики, а так же коррекцией со стороны разработчиков курсов.
Справочник по Java Collections Framework
Данная публикация не является полным разбором или анализом (не покрывает пакет java.util.concurrent ). Это, скорее, справочник, который поможет начинающим разработчикам понять ключевые отличия одних коллекций от других, а более опытным разработчикам просто освежить материал в памяти.
Что такое Java Collections Framework?
Java Collection Framework — иерархия интерфейсов и их реализаций, которая является частью JDK и позволяет разработчику пользоваться большим количесвом структур данных из «коробки».
Базовые понятия
Интерфейс Map [doc]
Hashtable — реализация такой структуры данных, как хэш-таблица. Она не позволяет использовать null в качестве значения или ключа. Эта коллекция была реализована раньше, чем Java Collection Framework, но в последствии была включена в его состав. Как и другие коллекции из Java 1.0, Hashtable является синхронизированной (почти все методы помечены как synchronized ). Из-за этой особенности у неё имеются существенные проблемы с производительностью и, начиная с Java 1.2, в большинстве случаев рекомендуется использовать другие реализации интерфейса Map ввиду отсутствия у них синхронизации.
WeakHashMap — реализация хэш-таблицы, которая организована с использованием weak references. Другими словами, Garbage Collector автоматически удалит элемент из коллекции при следующей сборке мусора, если на ключ этого элеметна нет жёстких ссылок.
Интерфейс List [doc]
Реализации этого интерфейса представляют собой упорядоченные коллекции. Кроме того, разработчику предоставляется возможность доступа к элементам коллекции по индексу и по значению (так как реализации позволяют хранить дубликаты, результатом поиска по значению будет первое найденное вхождение).
ArrayList — как и Vector является реализацией динамического массива объектов. Позволяет хранить любые данные, включая null в качестве элемента. Как можно догадаться из названия, его реализация основана на обычном массиве. Данную реализацию следует применять, если в процессе работы с коллекцией предплагается частое обращение к элементам по индексу. Из-за особенностей реализации поиндексное обращение к элементам выполняется за константное время O(1). Но данную коллекцию рекомендуется избегать, если требуется частое удаление/добавление элементов в середину коллекции. Подробный анализ и описание можно почитать в этом хабратопике.
Интерфейс Set [doc]
Представляет собой неупорядоченную коллекцию, которая не может содержать дублирующиеся данные. Является программной моделью математического понятия «множество».
Интерфейс Queue [doc]
Этот интерфейс описывает коллекции с предопределённым способом вставки и извлечения элементов, а именно — очереди FIFO (first-in-first-out). Помимо методов, определённых в интерфейсе Collection, определяет дополнительные методы для извлечения и добавления элементов в очередь. Большинство реализаций данного интерфейса находится в пакете java.util.concurrent и подробно рассматриваются в данном обзоре.
Заключение
Java Collections Framework содержит большое количество различных структур данных, доступных в JDK «из коробки», которые в большинстве случаев покрывают все потребности при реализации логики приложения. Сравнение временных характеристик основных коллекций, которые зачастую используются в разработке приложений приведено в таблице:
При необходимости, разработчик может создать собственную реализацию, расширив или переопределив существующую логику, либо создав свою собственную реализацию подходящего интерфейса с нуля. Также существует некоторое количество готовых решений, которые являются альтернативой или дополнением к Java Collections Framework. Наиболее популярными являются Google Guava и Commons Collections.
Пакет java.util
Интерфейс Observer и класс Observable
Рассмотрим пример организации взаимодействия классов:
В результате работы на консоль будет выведено:
Коллекции
Зачастую в программе работа идет не с одним объектом, а с целой группой более или менее однотипных экземпляров (например, автопарк организации). Проще всего сделать это с помощью массивов. Однако, несмотря на то, что это достаточно эффективное решение для многих случаев, оно имеет некоторые ограничения. Так, обращаться к элементу массива можно только по его номеру (индексу). Также необходимо заранее задать длину массива и больше ее не менять.
Интерфейсы
Интерфейс Collection
Интерфейс Set
Интерфейс List
Интерфейс Map
Классы, которые реализуют этот интерфейс, хранят неупорядоченный набор объектов парами ключ/значение. Каждый ключ должен быть уникальным. Hashtable после модификации в JDK 1.2 реализует интерфейс Map. Порядок следования пар ключ/значение не определен.
Интерфейс SortedSet
Интерфейс SortedMap
Интерфейс Iterator
Таким образом, подводя итог, перечислим интерфейсы, используемые при работе с коллекциями:
Aбстрактные классы, используемые при работе с коллекциями
Конкретные классы коллекций
Классы LinkedList и ArrayList имеют схожую функциональность. Однако с точки зрения производительности они отличаются. Так, в ArrayList заметно быстрей (примерно на порядок) осуществляются операции прохода по всему списку (итерации) и получения данных. LinkedList почти на порядок быстрее выполняет операции удаления и добавления новых элементов.
Предположим, имеется массив строк, содержащий названия городов. Для того, чтобы найти элемент массива, содержащий название города, в общем случае требуется просмотреть весь массив, а если необходимо найти все элементы массива, то для поиска каждого, в среднем, потребуется просматривать половину массива. Такой подход может оказаться приемлемым только для небольших массивов.
Далее, если необходимо добавить новую пару ключ/значение, вычисляется новый индекс, и если этот индекс совпадает с уже имеющимся, то создается список ключей, на который указывает элемент массива ключей. Таким образом, при обратном извлечении ключа необходимо вычислить индекс массива по тому же алгоритму и получить его. Если ключ в массиве единственный, то используется значение элемента массива, если хранится несколько ключей, то необходимо обойти список и выбрать нужный.
Есть несколько соображений, относящихся к производительности классов, использующих для хранения данных алгоритм хэширования. В частности, размер массива. Если массив окажется слишком мал, то связанные списки будут слишком длинными и скорость поиска станет существенно снижаться, так как просмотр элементов списка будет такой же, как в обычном массиве. Чтобы этого избежать, задается некий коэффициент заполнения. При заполнении элементов массива, в котором хранятся ключи (или списки ключей) на эту величину, происходит увеличение массива и производится повторное реиндексирование. Таким образом, если массив окажется слишком мал, то он будет быстро заполняться и будет производиться операция повторного индексирования, которая отнимает достаточно много ресурсов. С другой стороны, если массив сделать большим, то при необходимости просмотреть последовательно все элементы коллекции, использующей алгоритм хэширования, придется обрабатывать большое количество пустых элементов массива ключей.
Начальный размер массива и коэффициент загрузки коллекции задаются при конструировании. Например:
Существует также конструктор без параметров, который использует значения по умолчанию 101 для размера массива (в последней версии значение уменьшено до 11) и 0.75 для коэффициента загрузки.
Использование алгоритма хэширования позволяет гарантировать, что скорость доступа к элементам коллекции такого типа будет увеличиваться не линейно, а логарифмически. Таким образом, при частом поиске каких-либо значений по ключу имеет смысл задействовать коллекции, применяющие алгоритм хэширования.
Итерация по всем элементам коллекции пропорциональна ее емкости. Поэтому имеет смысл не делать размер коллекций чрезмерно большим, если достаточно часто придется осуществлять итерацию по элементам.
Методы HashMap не являются синхронизированными. Для того, чтобы обеспечить нормальную работу в многопоточном варианте, следует использовать либо внешнюю синхронизацию потоков, либо синхронизированный вариант коллекции.
Класс Collections
Класс Collections является классом-утилитой и содержит несколько вспомогательных методов для работы с классами, обеспечивающими различные интерфейсы коллекций. Например, для сортировки элементов списков, для поиска элементов в упорядоченных коллекциях и т.д. Но, пожалуй, наиболее важным свойством этого класса является возможность получения синхронизированных вариантов классов-коллекций. Например, для получения синхронизированного варианта Map можно использовать следующий подход:
Какие высказывания относительно java util vector и java util hashtable можно считать корректными
Java Collections Framework
Назовите основные интерфейсы JCF и их реализации.
Интерфейс Collection расширяют интерфейсы:
Интерфейс Map реализован классами:
Что такое «fail-fast поведение»?
fail-fast поведение означает, что при возникновении ошибки или состояния, которое может привести к ошибке, система немедленно прекращает дальнейшую работу и уведомляет об этом. Использование fail-fast подхода позволяет избежать недетерминированного поведения программы в течение времени.
Реализация такого поведения осуществляется за счет подсчета количества модификаций коллекции (modification count):
Какая разница между fail-fast и fail-safe?
В противоположность fail-fast, итераторы fail-safe не вызывают никаких исключений при изменении структуры, потому что они работают с клоном коллекции вместо оригинала.
Приведите примеры итераторов, реализующих поведение fail-safe
Итератор коллекции CopyOnWriteArrayList и итератор представления keySet коллекции ConcurrentHashMap являются примерами итераторов fail-safe.
Хотя оба интерфейса и предназначены для обхода коллекций между ними имеются существенные различия:
Как избежать ConcurrentModificationException во время перебора коллекции?
Какая коллекция реализует дисциплину обслуживания FIFO?
Какая коллекция реализует дисциплину обслуживания FILO?
Vector это устаревший класс и его использование не рекомендовано.
ArrayList это список, реализованный на основе массива, а LinkedList — это классический двусвязный список, основанный на объектах с ссылками между ними.
В целом, LinkedList в абсолютных величинах проигрывает ArrayList и по потребляемой памяти, и по скорости выполнения операций. LinkedList предпочтительно применять, когда нужны частые операции вставки/удаления или в случаях, когда необходимо гарантированное время добавления элемента в список.
Смотря какие действия будут выполняться над структурой.
O(N). Время поиска элемента линейно пропорционально количеству элементов в списке.
O(N). Время поиска элемента линейно пропорционально количеству элементов с списке.
O(N). Добавление в начало/конец списка осуществляется за время O(1).
O(N). Вставка элемента в конец списка осуществляется за время O(1), но если вместимость массива недостаточна, то происходит создание нового массива с увеличенным размером и копирование всех элементов из старого массива в новый.
Необходимо добавить 1 млн. элементов, какую структуру вы используете?
Однозначный ответ можно дать только исходя из информации о том в какую часть списка происходит добавление элементов, что потом будет происходить с элементами списка, существуют ли какие-то ограничения по памяти или скорости выполнения.
Если в массиве достаточно места для размещения нового элемента, то дополнительной памяти не требуется. Иначе происходит создание нового массива размером в 1,5 раза превышающим существующий (это верно для JDK выше 1.7, в более ранних версиях размер увеличения иной).
Каждый элемент LinkedList хранит ссылку на предыдущий элемент, следующий элемент и ссылку на данные.
Для 64-битной JVM каждая ссылка занимает 64 бита (8 байт), размер заголовка каждого объекта составляет 16 байт (два машинных слова). Вычисления аналогичны: 8 + 8 + 8 + 16 = 40байт и 24 байта. Итого 64 байта.
Для ArrayList или для LinkedList операция добавления элемента в середину ( list.add(list.size()/2, newElement) ) медленнее?
Deque (Double Ended Queue) расширяет Queue и согласно документации, это линейная коллекция, поддерживающая вставку/извлечение элементов с обоих концов. Помимо этого, реализации интерфейса Deque могут строится по принципу FIFO, либо LIFO.
LinkedList — это односвязный, двусвязный или четырехсвязный список?
Двусвязный : каждый элемент LinkedList хранит ссылку на предыдущий и следующий элементы.
Stack считается «устаревшим». Чем его рекомендуют заменять? Почему?
Hashtable это устаревший класс и его использование не рекомендовано.
Результат выполнения кода:
В Java существует 4 типа ссылок: сильные (strong reference), мягкие (SoftReference), слабые (WeakReference) и фантомные (PhantomReference). Особенности каждого типа ссылок связаны с работой Garbage Collector. Если объект можно достичь только с помощью цепочки WeakReference (то есть на него отсутствуют сильные и мягкие ссылки), то данный объект будет помечен на удаление.
В WeakHashMap используются WeakReferences. А почему бы не создать SoftHashMap на SoftReferences?
В WeakHashMap используются WeakReferences. А почему бы не создать PhantomHashMap на PhantomReferences?
При добавлении элемента, который уже присутствует в LinkedHashMap (т.е. с одинаковым ключом), порядок итерации по элементам не изменяется.
Так же оно проявляется при итерации по коллекции.
HashMap состоит из «корзин» (bucket). С технической точки зрения «корзины» — это элементы массива, которые хранят ссылки на списки элементов. При добавлении новой пары «ключ-значение», вычисляет хэш-код ключа, на основании которого вычисляется номер корзины (номер ячейки массива), в которую попадет новый элемент. Если корзина пустая, то в нее сохраняется ссылка на вновь добавляемый элемент, если же там уже есть элемент, то происходит последовательный переход по ссылкам между элементами в цепочке, в поисках последнего элемента, от которого и ставится ссылка на вновь добавленный элемент. Если в списке был найден элемент с таким же ключом, то он заменяется.
HashMap реализован с использованием метода цепочек, т.е. каждой ячейке массива (корзине) соответствует свой связный список и при возникновении коллизии осуществляется добавление нового элемента в этот список.
Для метода цепочек коэффициент заполнения может быть больше 1 и с увеличением числа элементов производительность убывает линейно. Такие таблицы удобно использовать, если заранее неизвестно количество хранимых элементов, либо их может быть достаточно много, что приводит к большим значениям коэффициента заполнения.
Среди методов открытой реализации различают:
Недостатки структур с методом открытой адресации:
Преимущества хэш-таблицы с открытой адресацией:
По значению hashCode() вычисляется индекс ячейки массива, в список которой этот элемент будет добавлен. Перед добавлением осуществляется проверка на наличие элементов в этой ячейке. Если элементы с таким hashCode() уже присутствует, но их equals() методы не равны, то элемент будет добавлен в конец списка.
В общем случае операции добавления, поиска и удаления элементов занимают константное время.
Пример кода двоичного поиска:
Это возможно в случае, если метод, определяющий номер корзины будет возвращать одинаковые значения.
Допустим, в качестве ключа используется не примитив, а объект с несколькими полями. После добавления элемента в HashMap у объекта, который выступает в качестве ключа, изменяют одно поле, которое участвует в вычислении хэш-кода. В результате при попытке найти данный элемент по исходному ключу, будет происходить обращение к правильной корзине, а вот equals уже не найдет указанный ключ в списке элементов. Тем не менее, даже если equals реализован таким образом, что изменение данного поля объекта не влияет на результат, то после увеличения размера корзин и пересчета хэш-кодов элементов, указанный элемент, с измененным значением поля, с большой долей вероятности попадет в совершенно другую корзину и тогда уже потеряется совсем.
Хэш-код массива не зависит от хранимых в нем элементов, а присваивается при создании массива (метод вычисления хэш-кода массива не переопределен и вычисляется по стандартному Object.hashCode() на основании адреса массива). Так же у массивов не переопределен equals и выполняется сравнение указателей. Это приводит к тому, что обратиться к сохраненному с ключом-массивом элементу не получится при использовании другого массива такого же размера и с такими же элементами, доступ можно осуществить лишь в одном случае — при использовании той же самой ссылки на массив, что использовалась для сохранения элемента.
hashCode позволяет определить корзину для поиска элемента, а equals используется для сравнения ключей элементов в списке корзины и искомого ключа.
Но начиная с Java 8, после определенного числа элементов в списке, связный список преобразовывается в красно-черное дерево и сложность выборки, даже в случае плохой хеш-функции, не хуже логарифмической O(log(N))
Сколько переходов происходит в момент вызова HashMap.get(key) по ключу, который есть в таблице?
Да, будет, но в этом случае HashMap вырождается в связный список и теряет свои преимущества.
TreeSet обеспечивает упорядоченно хранение элементов в виде красно-черного дерева. Сложность выполнения основных операций не хуже O(log(N)) (Логарифмическое время).
Что будет, если добавлять элементы в TreeSet по возрастанию?
В основе TreeSet лежит красно-черное дерево, которое умеет само себя балансировать. В итоге, TreeSet все равно в каком порядке вы добавляете в него элементы, преимущества этой структуры данных будут сохраняться.
Помимо всего EnumSet предоставляет множество статических методов инициализации для упрощенного и удобного создания экземпляров.
Какие существуют способы перебирать элементы списка?
Каким образом можно получить синхронизированные объекты стандартных коллекций?
Как получить коллекцию только для чтения?
Эти методы принимают коллекцию в качестве параметра, и возвращают коллекцию только для чтения с теми же элементами внутри.
Как, используя LinkedHashMap, сделать кэш c «invalidation policy»?
Стоит заметить, что LinkedHashMap не позволяет полностью реализовать LRU-алгоритм, поскольку при вставке уже имеющегося в коллекции элемента порядок итерации по элементам не меняется.
Как одной строчкой скопировать элементы любой collection в массив?
Как одним вызовом из List получить List со всеми элементами, кроме первых и последних 3-х?











