Каков порядок вызова конструкторов и блоков инициализации с учётом иерархии классов?
Сначала вызываются все статические блоки в очередности от первого статического блока корневого предка и выше по цепочке иерархии до статических блоков самого класса.
Затем вызываются нестатические блоки инициализации корневого предка, конструктор корневого предка и так далее вплоть до нестатических блоков и конструктора самого класса.
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
Пример:
Результат выполнения:
!!! Static initializer
!!! Non-static initializer
!!! a() called
Сначала вызываются все статические блоки в очередности от первого статического блока корневого предка и выше по цепочке иерархии до статических блоков самого класса.
Затем вызываются нестатические блоки инициализации корневого предка, конструктор корневого предка и так далее вплоть до нестатических блоков и конструктора самого класса.
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 является потокобезопасной структурой данных. Она обеспечивает безопасное чтение и запись элементов из нескольких потоков без необходимости явной синхронизации.
Это реализация интерфейса Set, предназначенная для хранения уникальных элементов в отсортированном порядке. Она основана на структуре данных, называемой Skip List, и обеспечивает эффективную поддержку многопоточности.
Основные особенности ConcurrentSkipListSet:
🔹 ConcurrentSkipListSet не позволяет хранить дублирующиеся элементы. Если вы попытаетесь добавить в него элемент, который уже существует, операция добавления завершится успешно, но элемент не будет дублироваться.
🔹 Элементы в ConcurrentSkipListSet хранятся в отсортированном порядке по их естественному порядку (если элементы реализуют интерфейс Comparable) или с использованием заданного компаратора.
🔹 ConcurrentSkipListSet является потокобезопасной структурой данных. Она обеспечивает безопасное чтение и запись элементов из нескольких потоков без необходимости явной синхронизации.
Что выведет код выше?
Anonymous Quiz
7%
1
40%
null
31%
Произойдет ошибка компиляции
22%
Во время исполнения возникнет исключение NullPointerException
🧑💻 Статьи для IT: как объяснять и распространять значимые идеи
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Thread.UncaughtExceptionHandler
Thread.UncaughtExceptionHandler — это интерфейс в языке программирования Java, который используется для обработки неотловленных исключений (uncaught exceptions) в потоках (threads). Когда исключение возникает в потоке и не обрабатывается внутри этого потока, оно передается обработчику неотловленных исключений, если такой обработчик был установлен.
Интерфейс Thread.UncaughtExceptionHandler имеет один метод:
Этот метод вызывается, когда в потоке t возникает неотловленное исключение e. Вы можете предоставить свою собственную реализацию этого метода, чтобы определить, как обрабатывать неотловленные исключения. Это может быть полезно, например, для записи информации об исключении в журнал, отправки уведомлений или выполнения других действий, когда неотловленное исключение возникает в приложении.
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() для получения строкового представления.
В Java массивы не переопределяют toString(), поэтому, если вы попытаетесь напечатать его напрямую, вы получите имя класса + '@' + шестнадцатеричный хеш-код массива, как определено в Object.toString().
Но обычно нам на самом деле нужно что бы напечаталось содержимое массива. Самый простой способ это сделать, это воспользоваться методом Arrays.toString(). А если массив содержит другие массивы, то Arrays.deepToString().
Внутри этих методов на каждом элементе массива вызывается метод toString() для получения строкового представления.
Что это — --х;
Anonymous Quiz
7%
префиксный инкремент
3%
постфиксный инкремент
84%
префиксный декремент
6%
постфиксный декремент
Расскажите о ThreadPoolExecutor
ThreadPoolExecutor — это класс в Java, который предоставляет управление пулами потоков для выполнения асинхронных задач. Он является частью пакета java.util.concurrent, который предоставляет различные средства для работы с параллельными и асинхронными задачами.
Что такое Instance Variable?
Ответ: Instance Variable — переменная, которая определена внутри класса, и она существует вплоть до того момента, пока существует объект.
Ответ: Instance Variable — переменная, которая определена внутри класса, и она существует вплоть до того момента, пока существует объект.
Какая разница между Statement и PreparedStatement?
Statement и PreparedStatement — это два интерфейса в JDBC, которые используются для выполнения SQL-запросов. Они имеют несколько отличий:
— Statement используется для выполнения статических SQL-запросов без параметров.
— PreparedStatement используется для выполнения динамических SQL-запросов с параметрами. Этот интерфейс принимает входные параметры во время выполнения и может быть использован многократно.
— PreparedStatement прекомпилирован, поэтому его исполнение может происходить быстрее, чем у Statement.
— PreparedStatement также обеспечивает дополнительную безопасность, предотвращая атаки типа SQL-инъекции.
В общем, если в запрос нужно передавать параметры или он должен выполняться несколько раз, используйте PreparedStatement. В противном случае используйте Statement.
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 переменные в разделяемом объекте, который был корректно проинициализирован.
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, индекс начала и индекс конца. Мы меняем местами элементы массива от начала до конца и уменьшаем индекс начала и увеличиваем индекс конца до тех пор, пока они не пересекутся.
Метод rotate принимает массив nums и целое число k. Сначала мы проверяем, что k не отрицательное число и не больше длины массива. Затем мы вызываем метод reverse, который переворачивает первую часть массива от начала до конца — k-1.
Метод reverse переворачивает вторую часть массива от конца — k до конца. Наконец, мы вызываем метод reverse, который переворачивает весь массив. Это позволяет нам получить массив, который был повернут на k шагов вправо.
Метод reverse принимает массив nums, индекс начала и индекс конца. Мы меняем местами элементы массива от начала до конца и уменьшаем индекс начала и увеличиваем индекс конца до тех пор, пока они не пересекутся.
Какие два класса не наследуются от Object?
Ответ: таких классов нет: все классы прямо или через предков наследуются от класса Object.
Ответ: таких классов нет: все классы прямо или через предков наследуются от класса Object.
Какие есть режимы доступа к файлу?
В Java есть несколько режимов доступа к файлам:
— Read (чтение): открывает файл для чтения, позволяет читать данные из файла.
— Write (запись): открывает файл для записи, позволяет записывать данные в файл. При этом старое содержимое файла удаляется.
— Append (добавление): открывает файл для записи, но данные добавляются в конец файла, старое содержимое сохраняется.
— RandomAccess (произвольный доступ): позволяет читать и записывать данные в произвольном месте в файле.
Для указания режима доступа используются константы из класса File:
File.READ, File.WRITE, File.APPEND и т.д.
Выбор нужного режима зависит от задачи, а комбинируя режимы, можно получить различные варианты работы с файлами.
В Java есть несколько режимов доступа к файлам:
— Read (чтение): открывает файл для чтения, позволяет читать данные из файла.
— Write (запись): открывает файл для записи, позволяет записывать данные в файл. При этом старое содержимое файла удаляется.
— Append (добавление): открывает файл для записи, но данные добавляются в конец файла, старое содержимое сохраняется.
— RandomAccess (произвольный доступ): позволяет читать и записывать данные в произвольном месте в файле.
Для указания режима доступа используются константы из класса File:
File.READ, File.WRITE, File.APPEND и т.д.
Выбор нужного режима зависит от задачи, а комбинируя режимы, можно получить различные варианты работы с файлами.