Библиотека собеса по Java | вопросы с собеседований
4.97K subscribers
243 photos
69 links
Вопросы с собеседований по Java и ответы на них.

Список наших каналов: https://t.me/proglibrary/9197
Учиться у нас: https://proglib.io/w/08c603b6

Обратная связь: @proglibrary_feedback_bot

По рекламе: @proglib_adv
Прайс: @proglib_advertising
Download Telegram
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

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

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

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

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

• При переопределении метода нельзя сузить модификатор доступа к методу (например с public в MainClass до private в Class extends MainClass).
• Изменить тип возвращаемого значения при переопределении метода нельзя, будет ошибка attempting to use incompatible return type.
• Можно сузить возвращаемое значение, если они совместимы.
Например:

public class Animal {

public Animal eat() {
System.out.println(«animal eat»);
return null;
}

public Long calc() {
return null;
}

}
public class Dog extends Animal {

public Dog eat() {
return new Dog();
}
/*attempting to use incompatible return type
public Integer calc() {
return null;
}
*/
}
Для чего используется оператор assert?

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

Основные применения assert:
⚡️ Проверка предусловий и постусловий в методах.

⚡️ Проверка инвариантов в критических секциях кода.

⚡️ Отладка при разработке, чтобы проверить ожидаемое состояние программы в определенных точках.

⚡️ Проверка условий в потенциально опасных ситуациях, например при работе с массивами.

assert лучше использовать для отладки и проверки инвариантов, а для критически важных проверок предусловий лучше применять явную проверку условий и выброс исключений.
Дайте определение терминам «простой», «составной» (composite), «потенциальный» (candidate) и «альтернативный» (alternate) ключ.

Простой ключ состоит из одного атрибута (поля). Составной — из двух и более.

Потенциальный ключ — простой или составной ключ, который уникально идентифицирует каждую запись набора данных. При этом потенциальный ключ должен обладать критерием неизбыточности: при удалении любого из полей набор полей перестает уникально идентифицировать запись.

Из множества всех потенциальных ключей набора данных выбирают первичный ключ, все остальные ключи называют альтернативными.
Что такое «фреймворк Fork/Join»?

Фреймворк Fork/Join, представленный в JDK 7, — это набор классов и интерфейсов позволяющих использовать преимущества многопроцессорной архитектуры современных компьютеров. Он разработан для выполнения задач, которые можно рекурсивно разбить на маленькие подзадачи, которые можно решать параллельно.

• Этап Fork: большая задача разделяется на несколько меньших подзадач, которые в свою очередь также разбиваются на меньшие. И так до тех пор, пока задача не становится тривиальной и решаемой последовательным способом.
• Этап Join: далее (опционально) идёт процесс «свёртки» — решения подзадач некоторым образом объединяются пока не получится решение всей задачи.
Решение всех подзадач (в т.ч. и само разбиение на подзадачи) происходит параллельно.

Для решения некоторых задач этап Join не требуется. Например, для параллельного QuickSort — массив рекурсивно делится на всё меньшие и меньшие диапазоны, пока не вырождается в тривиальный случай из 1 элемента. Хотя в некотором смысле Join будет необходим и тут, т.к. всё равно остаётся необходимость дождаться пока не закончится выполнение всех подзадач.

Ещё одно замечательное преимущество этого фреймворка заключается в том, что он использует work-stealing алгоритм: потоки, которые завершили выполнение собственных подзадач, могут «украсть» подзадачи у других потоков, которые всё ещё заняты.
Хардкорный курс по математике для тех, кто правда любит математику!

Начать с вводных занятий можно здесь, ответив всего на 4 вопроса – https://proglib.io/w/12f47906

Что вас ждет:

– Вводный урок от CPO курса

– Лекции с преподавателями ВМК МГУ по темам: теория множеств, непрерывность функции, основные формулы комбинаторики, матрицы и операции над ними, градиентный спуск

– Практические задания для закрепления материала и ссылки на дополнительные материалы.

⚡️ Переходите и начинайте учиться уже сегодня – https://proglib.io/w/12f47906
Please open Telegram to view this post
VIEW IN TELEGRAM
Как узнать значение конкретного символа строки, зная его порядковый номер в строке?

Чтобы узнать значение конкретного символа в строке по его порядковому номеру, можно воспользоваться методом charAt(int index) класса String.

Этот метод возвращает символ, расположенный в строке по указанному индексу. Индексы нумеруются от 0 до длины строки минус 1.

Если переданный индекс находится вне диапазона длины строки, будет выброшено исключение IndexOutOfBoundsException.
⚡️Proglib запускает канал про ИИ для генерации звука

Там мы будем рассказывать про все существующие нейросети, которые генерируют музыку и голос — с пошаговыми инструкциями, инструментами и лайфхаками.

⭐️генерация голоса и музыки
⭐️замена и перевод речи
⭐️распознавание звуков

👉Подписывайтесь!
Может ли метод принимать аргументы переменной длины?

В Java метод может принимать переменное количество аргументов двумя основными способами:

— Используя массив в качестве параметра. При определении метода указывается, что один из параметров — это массив некоторого типа. При вызове метода в этот параметр можно передать массив нужной длины.

— Используя специальный синтаксис с многоточием. При определении метода один из параметров объявляется с многоточием после типа. Это говорит компилятору, что это параметр переменной длины. При вызове в него можно передать сколько угодно аргументов указанного типа.

Таким образом метод становится более гибким и его можно вызывать с разным количеством аргументов в зависимости от ситуации. Это избавляет от необходимости перегружать метод для разного числа параметров.
Что такое сигнатура метода?

Это уникальная строка, которая описывает типы и порядок аргументов, а также возвращаемый тип метода. Сигнатура используется компилятором Java для различения методов с одинаковым именем, но отличающихся по своим параметрам.
Реализуйте простой кэш на Java. Класс должен поддерживать операции добавления значения по ключу, получения значения по ключу и удаления значения по ключу. Кэш должен иметь фиксированный размер, и при превышении этого размера он должен удалять самый старый элемент. Как вы обеспечите оптимальную производительность операций?

Решение:
Кэш будет представлять собой обобщенный класс SimpleCache, который может хранить пары ключ-значение. Размер кэша будет ограничен, чтобы избежать переполнения. В случае превышения размера, самый старый элемент будет удаляться.
Для хранения данных будем использовать HashMap (cache), так как это обеспечит эффективный доступ к значениям по ключу. Для отслеживания порядка ключей (чтобы определить самый старый элемент) будем использовать Queue (keyQueue), в данном случае LinkedList.

Инициализируем кэш. Конструктор SimpleCache принимает максимальный размер кэша и инициализирует cache и keyQueue. Добавляем элемент в кэш и при добавлении элемента проверяем, не превышен ли максимальный размер. Если превышен, вызываем метод evictOldest для удаления самого старого элемента.
Добавляем новый элемент в cache и помещаем ключ в keyQueue. Получаем элемент по ключу. Если элемент существует в кэше, перемещаем соответствующий ключ в конец keyQueue (чтобы отметить последнее использование) и возвращаем значение. Удаляем элемент из cache и соответствующий ключ из keyQueue. Получаем самый старый ключ из начала keyQueue, удаляем соответствующий элемент из cache.
Array или ArrayList?

Выбор между Array и ArrayList зависит от специфики задачи Java, которую вы хотите решить. Запомните следующие особенности этих типов:

— Массив имеет фиксированный размер, и память для него выделяется во время объявления, а размер ArrayList может динамически меняться.

— Массивы Java работают намного быстрее, а в ArrayList намного проще добавлять и удалять элементы.

— При работе с Array скорее всего возникнет ошибка ArrayIndexOutOfBoundsException.

— ArrayList может быть только одномерным, когда массивы Java могут быть многомерными.
RecursiveTask

RecursiveTask является частью фреймворка Fork/Join в Java, введенного в Java 7. Этот фреймворк предоставляет удобный способ распараллеливания выполнения задач.

RecursiveTask является подклассом ForkJoinTask. Он предназначен для использования вместе с пулом Fork/Join (ForkJoinPool) и предоставляет специальные методы для разделения задачи на подзадачи и объединения результатов.
System.currentTimeMillis или System.nanoTime?

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

➡️ Метод System.currentTimeMillis() возвращает текущее количество миллисекунд с начала эры Unix в формате Long. Его точность составляет от 1 до 15 тысячных долей секунды в зависимости от системы.

long startTime = System.currentTimeMillis();
long estimatedTime = System.currentTimeMillis() — startTime;

➡️ Метод System.nanoTime() имеет точность до одной миллионной секунды (наносекунды) и возвращает текущее значение наиболее точного доступного системного таймера.

long startTime = System.nanoTime();
long estimatedTime = System.nanoTime() — startTime;

Таким образом, метод System.currentTimeMillis() лучше применять для отображения и синхронизации абсолютного времени, а System.nanoTime() для измерения относительных интервалов времени.
Расскажите про приведение типов. Что такое понижение и повышение типа?

Приведение типов — это преобразование переменной одного типа в другой.

Существует два вида приведения типов:
— Повышение типа (widening): автоматическое преобразование типа в другой, более широкий тип. Например, int в long. При этом не теряется точность, так как широкий тип может представить все значения узкого типа.
— Понижение типа (narrowing): явное приведение к более узкому типу, например double в int. Здесь возможна потеря точности, поэтому требуется явное приведение в коде.

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

Число значений следует из сигнатуры int hashCode() и равно диапазону типа int — 2^32.
Класс Character

Класс Character в Java является классом-обёрткой для примитивного типа данных char. Он предоставляет несколько полезных методов для работы с символами, таких как проверка на принадлежность к различным категориям (цифры, буквы, пробелы и т.д.) и преобразование регистров.
ListIterator

ListIterator — это интерфейс в Java, который предоставляет возможность итерации по элементам списка в обоих направлениях (вперед и назад). Этот интерфейс является частью Java Collections Framework и расширяет интерфейс Iterator.
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

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

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

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

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

В этом примере используется List numbers, который содержит числа. С помощью Collections.sort() список чисел сортируется в порядке возрастания. Затем вычисляется индекс середины списка. Если размер списка четный, то найдутся два средних элемента, их среднее значение вычисляется и выводится на экран. Если размер списка нечетный, то выводится только один средний элемент.

Пример вывода (для списка чисел [1, 2, 3, 4, 5, 6, 7, 8]):
Средние элементы: 4, 5
Среднее значение: 4.5