Библиотека собеса по Java | вопросы с собеседований
6.38K subscribers
359 photos
4 videos
201 links
Вопросы с собеседований по Java и ответы на них.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/08c603b6

Работать у нас: https://job.proglib.io/

Наши каналы: https://yangx.top/proglibrary/9197
加入频道
Дан целочисленный массив nums, поверните массив вправо на k шагов.

Метод rotate принимает массив nums и целое число k. Сначала мы проверяем, что k не отрицательное число и не больше длины массива. Затем мы вызываем метод reverse, который переворачивает первую часть массива от начала до конца — k-1.

Метод reverse переворачивает вторую часть массива от конца — k до конца. Наконец, мы вызываем метод reverse, который переворачивает весь массив. Это позволяет нам получить массив, который был повернут на k шагов вправо.

Метод reverse принимает массив nums, индекс начала и индекс конца. Мы меняем местами элементы массива от начала до конца и уменьшаем индекс начала и увеличиваем индекс конца до тех пор, пока они не пересекутся.
Какие два класса не наследуются от Object?

Ответ: таких классов нет: все классы прямо или через предков наследуются от класса Object.
Какие есть режимы доступа к файлу?

В Java есть несколько режимов доступа к файлам:

— Read (чтение): открывает файл для чтения, позволяет читать данные из файла.

— Write (запись): открывает файл для записи, позволяет записывать данные в файл. При этом старое содержимое файла удаляется.

— Append (добавление): открывает файл для записи, но данные добавляются в конец файла, старое содержимое сохраняется.

— RandomAccess (произвольный доступ): позволяет читать и записывать данные в произвольном месте в файле.

Для указания режима доступа используются константы из класса File:
File.READ, File.WRITE, File.APPEND и т.д.

Выбор нужного режима зависит от задачи, а комбинируя режимы, можно получить различные варианты работы с файлами.
Что такое Casting?

Ответ: casting, или приведение типов — это процесс преобразования одного типа данных в другой тип данных: вручную (неявное приведение) или автоматически (явное приведение типов).
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.

Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.

Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.

👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Какие преобразования называются нисходящими и восходящими?

Восходящее преобразование (Upcasting) — это преобразование объекта дочернего класса в объект родительского класса. Преобразование может быть выполнено неявно, так как дочерний класс является подтипом родительского класса. Восходящее преобразование позволяет нам получить доступ к членам родительского класса, но не ко всем членам дочернего класса.

Нисходящее преобразование (Downcasting) — это преобразование объекта родительского класса в объект дочернего класса. Это преобразование не может быть выполнено неявно и требует явного указания типа. Нисходящее преобразование может быть опасным, так как оно может привести к ошибке ClassCastException, если типы не совместимы.
Могут ли нестатические методы перегрузить статические?

Ответ: Да. В итоге получится два разных метода. Статический будет принадлежать классу и будет доступен через его имя, а нестатический будет принадлежать конкретному объекту и доступен через вызов метода этого объекта.
Как работает метод Thread.join()?

Когда поток вызывает join() для другого потока, текущий работающий поток будет ждать, пока другой поток, к которому он присоединяется, не будет завершён.
Когда использовать рефлексии?

Уверен многих кто только начал учить ReflectionAPI удивили возможности этого инструмента. Но работа с ним довольно тяжёлая для системы, поэтому лучше использовать её в крайних случаях.

К примеру — обработка класса с аннотациями (пример выше). Извлекая аннотации из объектов класса, можно обрабатывать её каким угодно образом.

Также рефлексии часто применяют в тестировке, а именно для приватных полей и методов. Достаточно получить метод из класса, задать method.isAccessible(true) и можно вызывать его как публичный.
Может ли статический метод быть переопределён или перегружен?

Cтатические методы не могут быть переопределены или перегружены в подклассах.

Причина в том, что статические методы принадлежат классу, а не объекту. Они вызываются через имя класса, а не через ссылку на объект.
Переопределение и перегрузка работают только с нестатическими методами в иерархии классов. При вызове нестатического метода используется динамическая диспетчеризация для определения нужной реализации метода в runtime.

Но со статическими методами так не работает. Компилятор связывает вызов статического метода с конкретным классом во время компиляции. Поэтому статические методы не могут быть переопределены или перегружены.
Какова иерархия исключений?

В Java иерархия исключений выстраивается следующим образом:

— Все исключения являются потомками класса Throwable.
— Класс Throwable имеет два подкласса: Exception и Error.
— Класс Exception предназначен для исключений, возникающих во время выполнения программы. Он делится на два подкласса:
— Checked exception — исключения, которые обязательно нужно обрабатывать или объявлять. К ним относятся SQLException, IOException и другие.
— Unchecked exception (RuntimeException) — исключения, обработка которых необязательна. Например, NullPointerException, ArithmeticException.
— Класс Error предназначен для ошибок, возникающих вне программы. Это могут быть ошибки JVM, например OutOfMemoryError.

При разработке приложений важно выбирать нужный тип исключения, чтобы правильно обрабатывать различные ситуации.
Что такое анонимные классы и где они применяются?

Анонимные классы — это классы без имени, которые используются для создания объекта определенного класса или интерфейса «на лету».

Анонимные классы удобны, когда нужно создать простой класс «одноразового использования» для какой-то конкретной задачи. Они позволяют избежать громоздких именованных классов в таких случаях.

Чаще всего они применяются для:

— создания обработчика событий в GUI-приложениях.
— создания компаратора или другого функционального интерфейса для сортировки или фильтрации коллекций.
— расширения класса путем создания подкласса без имени.
Можно ли использовать private или protected переменные в interface?

Ответ: В Java переменные, объявленные с модификаторами private или protected, не могут быть использованы непосредственно в интерфейсах (interfaces). Интерфейсы содержат только абстрактные методы, константы и методы по умолчанию (default methods), которые все являются public.
Сколько необходимо дополнительной памяти при вызове ArrayList.add()?

Если в массиве достаточно места для размещения нового элемента, то дополнительной памяти не требуется. Иначе происходит создание нового массива размером в 1,5 раза превышающим существующий (это верно для JDK выше 1.7, в более ранних версиях размер увеличения иной).
В чем разница между интерфейсами Comparable и Comparator?

Основное различие между интерфейсами Comparable и Comparator заключается в том, что в Comparable «зашит» один-единственный алгоритм сравнения объектов, в то время как Comparator представляет собой внешнюю заменяемую настройку. Архитектурно, Comparable — это интерфейс значения, в то время как Comparator — настройка контейнера.

Следует использовать Comparable, когда задается естественный (наиболее логичный) порядок. Например, для строк это регистрозависимое лексикографическое сравнение, а для длинных чисел — сравнение по значению. Во всех остальных случаях — без отдельного компаратора не обойтись.
Может ли метод main выбросить исключение во вне и если да, то где будет происходить обработка данного исключения?

Метод main может выбросить исключение. Это исключение будет передано в JVM (виртуальную машину Java). JVM отловит это исключение и завершит выполнение программы, выведя stack trace (трассировку стека) исключения.

Таким образом, исключение из main приведет к аварийному завершению программы.

Чтобы избежать этого, лучшей практикой является перехватывать исключения внутри main и обрабатывать их, не допуская выброса за его пределы.
Почему нежелательно использовать Thread.stop()?

Thread.stop() считается нежелательным для использования, потому что он не является безопасным. Остановка потока приводит к разблокированию всех мониторов, которые он заблокировал. Если какие-либо объекты, ранее защищенные этими мониторами, находились в несогласованном состоянии, другие потоки могут видеть эти объекты в несогласованном состоянии. Такие объекты называются поврежденными. Когда потоки работают с поврежденными объектами, может возникнуть произвольное поведение.

Вместо использования Thread.stop() рекомендуется использовать согласованный механизм, такой как interrupt.
Поддерживает ли язык Java множественное наследование?

Это очень хитрый вопрос. Интервьюеры часто говорят: если язык C++ может поддерживать непосредственное множественное наследование, то почему Java не может?

Ответ несколько более сложен, чем может показаться на первый взгляд, поскольку Java поддерживает множественное наследование типов, ведь интерфейс в нём может расширять другие интерфейсы. Но множественное наследование реализаций язык Java не поддерживает.
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.

Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.

Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.

👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Для чего в JUnit используется аннотация @Ignore?

Ответ: Аннотация указывает JUnit на необходимость пропустить данный тестовый метод.
Чем отличается Lambda от анонимного класса?

Хотя в некоторых случаях они и могут быть использованы взаимозаменяемо, Lambda-выражения и анонимные классы имеют различия.

Разберем основные из них:

1. Синтаксис: Lambda-выражения имеют более краткий и лаконичный синтаксис по сравнению с анонимными классами.

2. Область применения: Lambda-выражения могут быть использованы только для функциональных интерфейсов, в то время как анонимные классы могут быть использованы для любых интерфейсов и абстрактных классов.

3. Ключевое слово this: В анонимных классах ключевое слово this ссылается на сам анонимный класс, в то время как в lambda-выражениях this ссылается на объемлющий.

4. Производительность: Lambda-выражения обычно имеют лучшую производительность по сравнению с анонимными классами, так как они компилируются в приватные методы и используют инструкцию invokedynamic.