Библиотека собеса по 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
加入频道
Каков порядок вызова конструкторов и блоков инициализации с учётом иерархии классов?

Сначала вызываются все статические блоки в очередности от первого статического блока корневого предка и выше по цепочке иерархии до статических блоков самого класса.

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

Parent static block(s) → Child static block(s) → Grandchild static block(s)

→ Parent non-static block(s) → Parent constructor →

→ Child non-static block(s) → Child constructor →

→ Grandchild non-static block(s) → Grandchild constructor

Пример:

public class MainClass {

public static void main(String args[]) {
new TestClass().a();
}
}


public class TestClass {
public static String v = «Some val»;
{
System.out.println(»!!! Non-static initializer»);
}
static {
System.out.println(»!!! Static initializer»);
}
public void a() {
System.out.println(»!!! a() called»);
}
}


Результат выполнения:

!!! Static initializer
!!! Non-static initializer
!!! a() called
public static void main(String[] args) {
byte x = 127;
x += 2;
System.out.println(x);
}
ConcurrentSkipListSet

Это реализация интерфейса Set, предназначенная для хранения уникальных элементов в отсортированном порядке. Она основана на структуре данных, называемой Skip List, и обеспечивает эффективную поддержку многопоточности.

Основные особенности ConcurrentSkipListSet:

🔹 ConcurrentSkipListSet не позволяет хранить дублирующиеся элементы. Если вы попытаетесь добавить в него элемент, который уже существует, операция добавления завершится успешно, но элемент не будет дублироваться.
🔹 Элементы в ConcurrentSkipListSet хранятся в отсортированном порядке по их естественному порядку (если элементы реализуют интерфейс Comparable) или с использованием заданного компаратора.
🔹 ConcurrentSkipListSet является потокобезопасной структурой данных. Она обеспечивает безопасное чтение и запись элементов из нескольких потоков без необходимости явной синхронизации.
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

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

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

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

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

Thread.UncaughtExceptionHandler — это интерфейс в языке программирования Java, который используется для обработки неотловленных исключений (uncaught exceptions) в потоках (threads). Когда исключение возникает в потоке и не обрабатывается внутри этого потока, оно передается обработчику неотловленных исключений, если такой обработчик был установлен.

Интерфейс Thread.UncaughtExceptionHandler имеет один метод:

void uncaughtException(Thread t, Throwable e);


Этот метод вызывается, когда в потоке t возникает неотловленное исключение e. Вы можете предоставить свою собственную реализацию этого метода, чтобы определить, как обрабатывать неотловленные исключения. Это может быть полезно, например, для записи информации об исключении в журнал, отправки уведомлений или выполнения других действий, когда неотловленное исключение возникает в приложении.
Arrays.toString() и Arrays.deepToString()

В Java массивы не переопределяют toString(), поэтому, если вы попытаетесь напечатать его напрямую, вы получите имя класса + '@' + шестнадцатеричный хеш-код массива, как определено в Object.toString().

Но обычно нам на самом деле нужно что бы напечаталось содержимое массива. Самый простой способ это сделать, это воспользоваться методом Arrays.toString(). А если массив содержит другие массивы, то Arrays.deepToString().

Внутри этих методов на каждом элементе массива вызывается метод toString() для получения строкового представления.
Какой оператор вычисляет остаток от деления?
Anonymous Quiz
1%
$
0%
#
98%
%
1%
**
1%
Свой вариант
Расскажите о ThreadPoolExecutor

ThreadPoolExecutor — это класс в Java, который предоставляет управление пулами потоков для выполнения асинхронных задач. Он является частью пакета java.util.concurrent, который предоставляет различные средства для работы с параллельными и асинхронными задачами.
Что такое Instance Variable?

Ответ: Instance Variable — переменная, которая определена внутри класса, и она существует вплоть до того момента, пока существует объект.
Сколько объектов типа String создает эта программа?

Ответ:
Программа создаст два string-объекта. Когда мы создаем строку, используя оператор new, она сначала создастся в Java String Pool и только потом в куче (heap memory). Но только при условии, что этой строки ещё нет в пуле Java String.
Какая разница между Statement и PreparedStatement?

Statement и PreparedStatement — это два интерфейса в JDBC, которые используются для выполнения SQL-запросов. Они имеют несколько отличий:

— Statement используется для выполнения статических SQL-запросов без параметров.
— PreparedStatement используется для выполнения динамических SQL-запросов с параметрами. Этот интерфейс принимает входные параметры во время выполнения и может быть использован многократно.
— PreparedStatement прекомпилирован, поэтому его исполнение может происходить быстрее, чем у Statement.
— PreparedStatement также обеспечивает дополнительную безопасность, предотвращая атаки типа SQL-инъекции.

В общем, если в запрос нужно передавать параметры или он должен выполняться несколько раз, используйте PreparedStatement. В противном случае используйте Statement.
Что такое ordering, as-if-serial semantics, sequential consistency, visibility, atomicity, happens-before, mutual exclusion, safe publication?

ordering — механизм, который определяет, когда один поток может увидеть out-of-order (неверный) порядок исполнения инструкций другого потока. CPU для для повышения производительности может переупорядочивать процессорные инструкции и выполнять их в произвольном порядке до тех пор пока для потока внутри не будет видно никаких отличий. Гарантия, предоставляемая этим механизмом, называется as-if-serial semantics.

sequential consistency — то же что и as-if-serial semantics, гарантия того, что в рамках одного потока побочные эффекты от всех операций будут такие, как будто все операции выполняются последовательно.

visibility определяет, когда действия в одном потоке становятся видны из другого потока.

happens-before — логическое ограничение на порядок выполнения инструкций программы. Если указывается, что запись в переменную и последующее ее чтение связаны через эту зависимость, то как бы при выполнении не переупорядочивались инструкции, в момент чтения все связанные с процессом записи результаты уже зафиксированы и видны.

atomicity — атомарность операций. Атомарная операция выглядит единой и неделимой командой процессора, которая может быть или уже выполненной или ещё невыполненной.

mutual exclusion (взаимоисключающая блокировка, семафор с одним состоянием) — механизм, гарантирующий потоку исключительный доступ к ресурсу. Используется для предотвращения одновременного доступа к общему ресурсу. В каждый момент времени таким ресурсом может владеть только один поток. Простейший пример: synchronized(obj) { … }.

safe publication — показ объектов другим потокам из текущего, не нарушая ограничений visibility. Способы такой публикации в Java:
• static{} инициализатор;
• volatile переменные;
• atomic переменные;
• сохранение в разделяемой переменной, корректно защищенной с использованием synchronized(), синхронизаторов или других конструкций, создающих read/write memory barrier;
• final переменные в разделяемом объекте, который был корректно проинициализирован.
Дан целочисленный массив 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 и т.д.

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